CodeBlanks Logo Icon CodeBlanks

Autoload (PSR-4)

PHP kursu · İleri seviye · Ders 37/92

composer'ın PSR-4 autoload'unu ve vendor/autoload.php kullanımını öğrenirsin.

vendor/autoload.php nedir?

Composer kurulumdan sonra vendor/autoload.php adlı bir dosya üretir. Bu dosyayı require_once ile çağırınca projedeki tüm sınıflar otomatik yüklenir; manuel require veya include yazmazsın.

autoload bölümündeki PSR-4 eşlemesi sınıf adlarını dosya yollarına bağlar. Örneğin App\ ile src/ eşleşmesi App\Models\User sınıfını src/Models/User.php dosyasına yönlendirir.

composer dump-autoload

composer dump-autoload komutu vendor/autoload.php dosyasını yeniden üretir. Yeni bir sınıf eklediğinde veya autoload eşlemesini değiştirdiğinde bu komutu çalıştırman gerekir; böylece eklenen sınıflar hemen kullanılabilir hale gelir.

Komut composer install ya da composer require sonrası otomatik çalışır; ancak yalnızca eşlemeyi güncellemek istediğinde dump-autoload tek başına da çalıştırılır.

Uygulama PSR-4 yol çözümleyici

Composer'ın autoload psr-4 bölümünü taklit eden bir resolveClass(string $class, array $config): string fonksiyonu yaz. $config["autoload"]["psr-4"] üzerinden dön; $class hangi prefix ile başlıyorsa (strpos ile 0 kontrolü) o prefix'i substr ile çıkar; kalan \ işaretlerini str_replace ile / yap; başına base ekle, sonuna .php ekle ve döndür.

$config dizisinde autoload => psr-4 => ["App\\" => "src/"] olsun. App\Models\User ve App\Services\Auth için yolları yazdır.

Örnek çözümü göster
string { foreach ($config["autoload"]["psr-4"] as $prefix => $base) { if (strpos($class, $prefix) === 0) { $relative = substr($class, strlen($prefix)); $relative = str_replace("\\", "/", $relative); return $base . $relative . ".php"; } } return ""; } tanımla. echo resolveClass("App\\Models\\User", $config) . "\n"; ve echo resolveClass("App\\Services\\Auth", $config) . "\n"; ile yazdır.
Örnek çözüm:
<?php
$config = ["autoload" => ["psr-4" => ["App\\" => "src/"]]];
function resolveClass(string $class, array $config): string {
    foreach ($config["autoload"]["psr-4"] as $prefix => $base) {
        if (strpos($class, $prefix) === 0) {
            $relative = substr($class, strlen($prefix));
            $relative = str_replace("\\", "/", $relative);
            return $base . $relative . ".php";
        }
    }
    return "";
}
echo resolveClass("App\\Models\\User", $config) . "\n";
echo resolveClass("App\\Services\\Auth", $config) . "\n";

Kendini test et

  1. PSR-4 eşlemelerini eşleştir

    App\Models\User
    src/Models/User.php
    App\Services\Auth
    src/Services/Auth.php
    App\Controller\Home
    src/Controller/Home.php
    App\Repository\UserRepo
    src/Repository/UserRepo.php
  2. require_once 'vendor/autoload.php'; ne yapar?

    • Yeni paket kurar
    • Sürüm kısıtı kontrol eder
    • vendor/ klasörünü siler
    • Tüm sınıfları otomatik yükler
    Cevabı göster

    Tüm sınıfları otomatik yükler — Doğru. require_once vendor/autoload.php PSR-4 autoloader'ı çağırır.

  3. autoload çağrısını tamamla

    <?php
    // Tüm sınıfları otomatik yükle
    ____ "vendor/autoload.php";
    
    $app = new App\Application();
    echo $app->name . "\n";
    
    Cevabı göster
    <?php
    // Tüm sınıfları otomatik yükle
    require_once "vendor/autoload.php";
    
    $app = new App\Application();
    echo $app->name . "\n";
    

İleri seviye bölümündeki tüm dersler