Autoload (PSR-4)
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
-
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
-
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.
-
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";