PSR-4 Autoloading Standardı
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 ad alanlarına ve dosya konumlarına göre otomatik olarak nasıl yüklenmesi gerektiğini tanımlayan bir standarttır. Her sınıf dosyasını manuel olarak dahil etmek yerine PSR-4, PHP’nin sınıfları kullandığınızda bunları otomatik olarak bulup yüklemesini sağlar.
Temel kural basittir: ad alanı, dizin yapısıyla eşleşmelidir. App\Models\User sınıfına sahipseniz dosya App/Models/User.php konumunda olmalı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ını izleyen basit bir otomatik yükleyici işlevi yazabilirsiniz:
<?php
// Dosya: autoload.php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// Sınıfın bizim namespace ö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;
}
}
});
spl_autoload_register işlevi, PHP’ye bilinmeyen bir sınıfla karşılaştığında işlevinizi çağırmasını söyler. İşlev, ad alanını bir dosya yoluna dönüştürür ve dosyayı yükler.
Temel Nokta: PSR-4, ad alanları ile 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 bilirsiniz. Bu kural, projelerde gezinmeyi ve projeleri sürdürmeyi kolaylaştırır.
Görev
KolayAd alanlarına ve dosya konumlarına göre sınıfları otomatik olarak yükleyen basit bir PSR-4 otomatik yükleme sistemi oluşturalım.
PSR-4'ün ad alanlarını dizin yollarıyla nasıl eşlediğini gösteren üç dosyalı bir proje oluşturacaksınız:
src/Services/Logger.php:App\Servicesad alanında birLoggersınıfı tanımlayın. Bu sınıfın birpublic $nameözelliği, adı kabul edip ayarlayan bir kurucusu ve"[name] logged: [message]"döndüren birlog($message)yöntemi olmalıdır.src/Services/Mailer.php:App\Servicesad alanında birMailersınıfı tanımlayın. Bu sınıfın birpublic $senderözelliği, göndereni kabul edip ayarlayan bir kurucusu ve"Mail from [sender] to [to]"döndüren birsend($to)yöntemi olmalıdır.main.php:App\ad alanı ön ekinisrc/dizinine eşleyen bir PSR-4 otomatik yükleyiciyispl_autoload_registerkullanarak oluşturun. Otomatik yükleyici, doğru dosyayı bulmak için ad alanı ayraçlarını dizin ayraçlarına dönüştürmeli ve sonuna.phpeklemelidir. Otomatik yükleyiciyi kaydettikten sonra her iki sınıfı içe aktarmak içinuseanahtar sözcüğünü kullanın; ardından adı"FileLogger"olan birLoggerve göndericisi"admin@site.com"olan birMaileroluşturun. Logger üzerindelog("System started")çağrısının ve mailer üzerindesend("user@example.com")çağrısının sonucunu yazdırın (her biri kendi satırında).
Temel fikir, otomatik yükleyici işlevinizin tam nitelikli sınıf adını (örneğin App\Services\Logger) alması ve bunu bir dosya yoluna (src/Services/Logger.php) dönüştürmesi gerektiğidir. Sınıfın ad alanı ön ekinizle başlayıp başlamadığını kontrol etmek için strpos, göreli sınıf adını elde etmek için substr ve ters eğik çizgileri düz eğik çizgilere dönüştürmek için str_replace kullanın.
Kendin dene
<?php
// PSR-4 Autoloader Uygulaması
// TODO: spl_autoload_register kullanarak bir autoloader kaydet
// Autoloader şunları yapmalıdır:
// 1. Sınıfın 'App\' ad alanı öneki ile başlayıp başlamadığını kontrol et
// 2. Göreli sınıf adını almak için 'App\' önekini kaldır
// 3. Ad alanı ayırıcılarını (\) dizin ayırıcılarına (/) dönüştür
// 4. Dosya yolunu oluşturmak için başına 'src/' ekle ve sonuna '.php' ekle
// 5. Dosya varsa require et
spl_autoload_register(function ($class) {
// TODO: Ad alanı önekini ve temel dizini tanımla
// TODO: Sınıfın ad alanı önekini kullanıp kullanmadığını kontrol et (strpos kullan)
// TODO: Göreli sınıf adını al (substr kullan)
// TODO: \ karakterini / ile değiştirerek dosya yolunu oluştur (str_replace kullan)
// TODO: Dosya varsa require et
});
// TODO: Logger ve Mailer sınıflarını içe aktarmak için 'use' anahtar kelimesini kullan
// TODO: "FileLogger" adıyla bir Logger örneği oluştur
// TODO: "admin@site.com" göndericisiyle bir Mailer örneği oluştur
// TODO: log("System started") sonucunu yazdır
// TODO: send("user@example.com") sonucunu yazdır
?>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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi