Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Ad 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.phpApp\Services ad alanında bir Logger sınıfı tanımlayın. Bu sınıfın public $name özelliği, bu ismi kabul eden ve atayan bir yapıcı metodu (constructor) ve "[name] logged: [message]" döndüren bir log($message) metodu olmalıdır.
  • src/Services/Mailer.phpApp\Services ad alanında bir Mailer sınıfı tanımlayın. Bu sınıfın public $sender özelliği, göndericiyi kabul eden ve atayan bir yapıcı metodu (constructor) ve "Mail from [sender] to [to]" döndüren bir send($to) metodu olmalıdır.
  • main.phpApp\ ad alanı önekini src/ dizinine eşleyen, spl_autoload_register kullanarak 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 .php eklemelidir. Otomatik yükleyiciyi kaydettikten sonra, her iki sınıfı da içe aktarmak için use anahtar kelimesini kullanın, ardından "FileLogger" ismine sahip bir Logger ve "admin@site.com" göndericisine sahip bir Mailer oluşturun. Logger üzerinde log("System started") ve mailer üzerinde send("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
?>
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