Aikido

PHP otomatik yükleme hataları nasıl düzeltilir: sınıf adlarını dosya adlarıyla eşleştirme

Hata Riski

Kural
Sınıf adı dosya adı ile eşleşmelidir.
Birçok dil, büyük/küçük harf duyarlı dosya
sistemlerinde (Linux) sorun yaşamamak için sınıf
adlarının dosya adlarıyla tamamen eşleşmesini

Desteklenen diller: PHP

Giriş

PHP'nin PSR-4 otomatik yükleme (autoloading) mekanizması, sınıf adlarının dosya adlarıyla büyük/küçük harf duyarlılığı dahil tam olarak eşleşmesini gerektirir. Şöyle adlandırılan bir sınıf: UserRepository şu dosya içinde yer almalıdır: UserRepository.php, şu dosya içinde değil: userrepository.php. Bu durum Windows ve macOS gibi büyük/küçük harf duyarsız dosya sistemlerinde sorunsuz çalışır ancak Linux sunucularda hata verir ve canlı (production) ortamda "Class not found" hatalarına yol açar.

Neden önemli?

Canlı ortam hataları: Eşleşmeyen adlar, dosya sistemlerinin büyük/küçük harfe duyarlı olduğu Linux sunucularda autoload hatalarına neden olur. Yerel ortamda çalışan kod canlıda hata verir, bu da acil düzeltmeler (hotfix) yapılmasını gerektirir ve kesintilere yol açar.

PSR-4 uyumluluğu: Modern PHP framework'leri PSR-4 autoloading mekanizmasına dayanır. İsimlendirme kurallarına uymayan sınıflar otomatik olarak yüklenemez; bu da bağımlılık enjeksiyonunu (dependency injection), servis konteynerlerini ve framework özelliklerini bozar.

Kod örnekleri

❌ Kural dışı:

<?php
// File: userrepository.php

namespace App\Repositories;

class UserRepository
{
    public function findById($id)
    {
        return User::find($id);
    }

    public function save(User $user)
    {
        return $user->save();
    }
}

Neden yanlış: Sınıf adı UserRepository ancak dosya adı userrepository.php (küçük harf). PSR-4 autoloader şunu arayacak: UserRepository.php ve büyük/küçük harf duyarlı Linux dosya sistemlerinde bu dosyayı bulamayarak canlı ortamda kritik hatalara neden olacaktır.

✅ Kurallara uygun:

<?php
// File: UserRepository.php

namespace App\Repositories;

class UserRepository
{
    public function findById($id)
    {
        return User::find($id);
    }

    public function save(User $user)
    {
        return $user->save();
    }
}

Neden önemli: Dosya adı UserRepository.php sınıf adıyla UserRepository (büyük/küçük harf duyarlılığı dahil) tam olarak eşleşmektedir. PSR-4 autoloader, sınıfı herhangi bir dosya sisteminde güvenilir bir şekilde bulup yükleyebilir; böylece ortama bağlı hatalar ortadan kalkar ve geliştirme ile canlı ortam arasında tutarlı bir davranış sağlanır.

Sonuç

Projenizin başından itibaren katı bir dosya adı ve sınıf adı eşleşmesi sağlayın. Sınıf oluştururken dosyaları otomatik olarak doğru şekilde adlandırmak için IDE'nizi yapılandırın. Uyuşmazlıkları dağıtımdan (deployment) önce yakalamak için CI/CD pipeline'larında otomatize edilmiş kontroller kullanın. Doğru isimlendirmeyi sağlamak için harcanacak beş dakika, canlı ortamdaki autoload hatalarını ayıklamak için harcanacak saatlerce süreden tasarruf sağlar.

Sık Sorulan Sorular

Sorularınız mı var?

Bu neden Windows/macOS üzerinde çalışırken Linux'ta başarısız oluyor?

Windows ve macOS varsayılan olarak büyük/küçük harf duyarsız dosya sistemleri kullanır (NTFS, APFS, HFS+). PHP'nin autoloader'ı UserRepository.php dosyasını istediğinde, bu sistemler dosya adlarını büyük/küçük harf açısından ayırt etmediği için userrepository.php dosyasını döndürür. Linux ise UserRepository.php ile userrepository.php dosyalarını tamamen farklı iki dosya olarak ele alan büyük/küçük harf duyarlı dosya sistemleri (ext4, xfs) kullanır. Autoloader tam eşleşme aradığı için başarısız olur.

Kod tabanımda tüm sınıf ve dosya adı uyuşmazlıklarını nasıl bulabilirim?

PHP dosyalarını tarayan, reflection veya regex kullanarak sınıf adlarını çıkaran ve bunları dosya adlarıyla karşılaştıran bir betik yazın. Birçok statik analiz aracı PSR-4 ihlallerini tespit eder. CI/CD sürecinde, composer dump-autoload --optimize --strict-psr komutuyla Composer'ın autoloader doğrulamasını çalıştırın. Bu, uyuşmazlıkları dağıtımdan önce yakalar. PhpStorm gibi bazı IDE'ler geliştirme sırasında PSR-4 ihlallerini vurgular.

Trait'ler, interface'ler ve soyut (abstract) sınıflar hakkında ne söylebiliriz?

Aynı kural onlar için de geçerlidir. UserRepositoryInterface adındaki bir interface, UserRepositoryInterface.php dosyasında yer almalıdır. Timestampable adında bir trait, Timestampable.php gerektirir. Soyut sınıflar da aynı kalıbı takip eder. PSR-4, sınıf benzeri tüm yapıları aynı şekilde ele alır. Dosya adı; sınıf, trait veya interface adı ile büyük/küçük harf duyarlılığı dahil tam olarak eşleşmelidir.

Dosya adlarında alt çizgi (underscore) veya tire (hyphen) kullanabilir miyim?

PSR-4 uyumluluğu açısından hayır. PHP sınıf adları tire veya çoğu özel karakteri içeremez. Alt çizgiler teknik olarak sınıf adlarında kullanılabilir ancak PSR standartları tarafından önerilmez. Hem sınıf adları hem de dosya adları için PascalCase kullanın: User_Repository veya user-repository yerine UserRepository. PSR-4 kurallarına uymak, framework uyumluluğunu sağlar.

Bir dosyada birden fazla sınıfım varsa ne olur?

Kullanmayın. PSR-4, sınıf adlarıyla eşleşen ve dosya başına tek bir sınıf olmasını gerektirir. Tek bir dosyadaki birden fazla sınıf, otomatik yüklemeyi (autoloading) bozar; çünkü autoloader, sınıf adları ile dosya yolları arasında 1:1 ilişkisi bekler. Sıkı sıkıya bağlı sınıflarınız varsa bunların iç sınıf (inner class) mı olması gerektiğini, ayrı dosyalar mı olması gerektiğini veya tek bir bütüncül sınıf olarak yeniden mi yapılandırılmaları gerektiğini değerlendirin. Dosya başına tek sınıf, temel bir PSR-4 gereksinimidir.

Bu kuralı ihlal eden eski (legacy) kodları nasıl ele almalıyım?

Linux sunuculara dağıtım yapmadan önce tüm uyuşmazlıkları düzeltin; çünkü uyuşmayan dosyalar prod ortamında anında autoload hatalarına yol açacaktır. Hem sınıfı hem de dosyayı aynı anda yeniden adlandıran IDE refaktör araçlarını kullanın. macOS üzerinde yalnızca büyük/küçük harf (case-only) değişiklikleri iki git commit gerektirebilir: önce geçici bir adla yeniden adlandırın (UserRepository_temp.php), commit yapın, ardından doğru büyük/küçük harfe göre yeniden adlandırın (UserRepository.php). Büyük kod tabanları için tüm ihlalleri özel bir PR'da düzeltin, kapsamlı bir şekilde test edin ve ardından dağıtın. Dosyaları yeniden adlandırdıktan sonra Composer'ın autoloader'ını güncelleyin (composer dump-autoload).

Namespace dosya adını etkiler mi?

Namespace, dosya adının kendisini değil dizin yapısını etkiler. App\\Repositories\\UserRepository sınıfı, app/Repositories/UserRepository.php (veya PSR-4 kök dizininize bağlı olarak src/Repositories/UserRepository.php) içinde bulunmalıdır. Namespace dizinlerle, sınıf adı ise dosya adıyla eşleşir. Her ikisi de PSR-4 kurallarına uymalıdır: namespace segmentleri eşleşen büyük/küçük harfle dizinlere karşılık gelir, sınıf adı ise eşleşen büyük/küçük harfle dosya adını belirler.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.