PSR-4 Autoloading Standartı
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 12 / 91.
PSR-4, PHP sınıflarının namespace'lerine ve dosya konumlarına göre nasıl otomatik olarak yüklenmesi gerektiğini tanımlayan bir standarttır. Her bir sınıf dosyasını manuel olarak dahil etmek yerine PSR-4, PHP'nin sınıfları kullandığınızda otomatik olarak bulmasını ve yüklemesini sağlar.
Temel kural basittir: ad alanı (namespace) dizin yapısıyla eşleşmelidir. Eğer App\Models\User adında bir sınıfınız varsa, dosya App/Models/User.php konumunda bulunmalıdır.
<?php
// Dosya: src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
PSR-4 kurallarına uyan basit bir otomatik yükleyici (autoloader) fonksiyonu yazabilirsiniz:
<?php
// Dosya: autoload.php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// Sınıfın bizim ad alanı (namespace) önekimizi kullanıp kullanmadığını kontrol et
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, Birden fazla kelime öbeği (strlen($prefix)));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
spl_autoload_register fonksiyonu, PHP'ye bilinmeyen bir sınıfla karşılaştığında fonksiyonunuzu çağırmasını söyler. Fonksiyon, ad alanını (namespace) bir dosya yoluna dönüştürür ve onu yükler.
Anahtar Nokta: PSR-4, ad alanları (namespaces) ve dosya yolları arasında öngörülebilir bir eşleme oluşturur. App\Models\User ifadesini gördüğünüzde, dosyanın src/Models/User.php konumunda olduğunu hemen anlarsınız. Bu kural, projelerde gezinmeyi ve projelerin bakımını yapmayı kolaylaştırır.
Görev
KolayAd alanına ve dosya konumuna göre sınıfları otomatik olarak yükleyen basit bir PSR-4 otomatik yükleme (autoloading) sistemi kuralım.
PSR-4'ün ad alanlarını dizin yollarıyla nasıl eşleştirdiğini gösteren üç dosyadan oluşan bir proje oluşturacaksınız:
src/Services/Logger.php—App\Servicesad alanında birLoggersınıfı tanımlayın. Bu sınıfınpublic $nameözelliği, bu ismi kabul eden ve atayan bir yapıcı metodu (constructor) ve"[name] logged: [message]"döndüren birlog($message)metodu olmalıdır.src/Services/Mailer.php—App\Servicesad alanında birMailersınıfı tanımlayın. Bu sınıfınpublic $senderözelliği, göndericiyi kabul eden ve atayan bir yapıcı metodu (constructor) ve"Mail from [sender] to [to]"döndüren birsend($to)metodu olmalıdır.main.php—App\ad alanı önekinisrc/dizinine eşleyen,spl_autoload_registerkullanarak bir PSR-4 otomatik yükleyici oluşturun. Otomatik yükleyici, ad alanı ayırıcılarını dizin ayırıcılarına dönüştürmeli ve doğru dosyayı bulmak için sonuna.phpeklemelidir. Otomatik yükleyiciyi kaydettikten sonra, her iki sınıfı da içe aktarmak içinuseanahtar kelimesini kullanın, ardından"FileLogger"ismine sahip birLoggerve"admin@site.com"göndericisine sahip birMaileroluşturun. Logger üzerindelog("System started")ve mailer üzerindesend("user@example.com")çağırmanın sonucunu (her biri kendi satırında olacak şekilde) yazdırın.
Buradaki temel nokta, otomatik yükleyici fonksiyonunuzun tam nitelikli sınıf adını (App\Services\Logger gibi) alması ve bunu bir dosya yoluna (src/Services/Logger.php) dönüştürmesi gerektiğidir. Sınıfın ad alanı önekinizle başlayıp başlamadığını kontrol etmek için strpos, göreli sınıf adını almak için substr ve ters eğik çizgileri düz eğik çizgilere dönüştürmek için str_replace kullanın.
Kopya kağıdı
PSR-4, PHP sınıflarının ad alanlarına (namespace) ve dosya konumlarına göre nasıl otomatik olarak yükleneceğini tanımlayan bir standarttır. Ad alanı, dizin yapısıyla eşleşmelidir.
Örnek sınıf yapısı:
<?php
// Dosya: src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
spl_autoload_register kullanan PSR-4 otomatik yükleyici (autoloader):
<?php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// Sınıfın bizim ad alanı önekimizi kullanıp kullanmadığını kontrol et
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
Otomatik yükleyici, doğru dosyayı bulmak için ad alanı ayırıcılarını (\) dizin ayırıcılarına (/) dönüştürür ve sonuna .php ekler. Örneğin, App\Models\User, src/Models/User.php ile eşleşir.
Kendin dene
<?php
// PSR-4 Otomatik Yükleyici (Autoloader) Uygulaması
// TODO: spl_autoload_register kullanarak bir otomatik yükleyici kaydedin
// Otomatik yükleyici şunları yapmalıdır:
// 1. Sınıfın 'App\' ad alanı (namespace) öneki ile başlayıp başlamadığını kontrol edin
// 2. Göreli sınıf adını almak için 'App\' önekini kaldırın
// 3. Ad alanı ayırıcılarını (\) dizin ayırıcılarına (/) dönüştürün
// 4. Dosya yolunu oluşturmak için başına 'src/' ve sonuna '.php' ekleyin
// 5. Eğer dosya mevcutsa dosyayı dahil edin (require)
spl_autoload_register(function ($class) {
// TODO: Ad alanı önekini ve temel dizini tanımlayın
// TODO: Sınıfın ad alanı önekini kullanıp kullanmadığını kontrol edin (strpos kullanın)
// TODO: Göreli sınıf adını alın (substr kullanın)
// TODO: \ karakterini / ile değiştirerek dosya yolunu oluşturun (str_replace kullanın)
// TODO: Eğer dosya mevcutsa dosyayı dahil edin (require)
});
// TODO: Logger ve Mailer sınıflarını içe aktarmak için 'use' anahtar kelimesini kullanın
// TODO: "FileLogger" ismiyle bir Logger örneği (instance) oluşturun
// TODO: "admin@site.com" göndericisiyle bir Mailer örneği oluşturun
// TODO: log("System started") sonucunu yazdırın
// TODO: send("user@example.com") sonucunu yazdırın
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi