Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Ad 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\Services ad alanında bir Logger sınıfı tanımlayın. Bu sınıfın bir public $name özelliği, adı kabul edip ayarlayan bir kurucusu ve "[name] logged: [message]" döndüren bir log($message) yöntemi olmalıdır.
  • src/Services/Mailer.php: App\Services ad alanında bir Mailer sınıfı tanımlayın. Bu sınıfın bir public $sender özelliği, göndereni kabul edip ayarlayan bir kurucusu ve "Mail from [sender] to [to]" döndüren bir send($to) yöntemi olmalıdır.
  • main.php: App\ ad alanı ön ekini src/ dizinine eşleyen bir PSR-4 otomatik yükleyiciyi spl_autoload_register kullanarak 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 .php eklemelidir. Otomatik yükleyiciyi kaydettikten sonra her iki sınıfı içe aktarmak için use anahtar sözcüğünü kullanın; ardından adı "FileLogger" olan bir Logger ve göndericisi "admin@site.com" olan bir Mailer oluşturun. Logger üzerinde log("System started") çağrısının ve mailer üzerinde send("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
?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi