Aikido

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

Hata Riski

Kural
Sınıf adı şu şekilde dosya dosya adıyla
Birçok dil için sınıf adlarının
'nin dosya dosya adlarıyla tam olarak ya da başarısız
başarısız başarısız büyük/küçük harf duyarlı dosya sistemlerinde (Linux).

Desteklenen diller: PHP

Giriş

PHP’nin PSR-4 otomatik yükleme standardı, sınıf adlarının dosya adlarıyla büyük/küçük harf ayrımı da dahil olmak üzere tam olarak eşleşmesini gerektirir. Adı Kullanıcı Deposu içinde bulunmalıdır UserRepository.php, değil userrepository.php. Bu, Windows ve macOS gibi büyük/küçük harf ayrımı yapmayan dosya sistemlerinde çalışır, ancak Linux sunucularında hata verir ve üretim ortamında “Sınıf bulunamadı” hatalarına neden olur.

Neden önemli?

Üretim ortamındaki arızalar: Büyük/küçük harf duyarlı dosya sistemlerine sahip Linux sunucularında, isimlerdeki uyumsuzluklar otomatik yükleme hatalarına yol açar. Yerel ortamda sorunsuz çalışan kodlar, üretim ortamında çalışmaz hale gelir; bu da acil düzeltme yamaları gerektirir ve hizmet kesintilerine neden olur.

PSR-4 uyumluluğu: Modern PHP çerçeveleri, PSR-4 otomatik yükleme özelliğine dayanır. Adlandırma kurallarına uymayan sınıflar otomatik olarak yüklenemez; bu da bağımlılık enjeksiyonunu, hizmet kapsayıcılarını ve çerçeve özelliklerini bozabilir.

Kod örnekleri

❌ Uygun değil:

<?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ı şudur: Kullanıcı Deposu ama dosya adı şudur: userrepository.php (küçük harf). PSR-4 otomatik yükleyici şunu arayacaktır: UserRepository.php ve büyük/küçük harf duyarlı Linux dosya sistemlerinde bunu bulamadıklarında, üretim ortamında ciddi hatalara yol açar.

✅ Uygunluk:

<?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();
    }
}

Bunun önemi: Dosya adı UserRepository.php sınıf adıyla eşleşir Kullanıcı Deposu Aynen öyle, büyük/küçük harf ayrımı da dahil. PSR-4 otomatik yükleyici, herhangi bir dosya sisteminde sınıfı güvenilir bir şekilde bulup yükleyebilir; böylece ortama özgü hataları ortadan kaldırır ve geliştirme ile üretim ortamları arasında tutarlı bir davranış sağlar.

Sonuç

Projenizin başlangıcından itibaren dosya adı ile sınıf adı arasında sıkı bir eşleşme kuralı uygulayın. Sınıf oluştururken dosyaların otomatik olarak doğru şekilde adlandırılması için IDE’nizi yapılandırın. Dağıtım öncesinde uyuşmazlıkları tespit etmek için CI/CD boru hatlarında otomatik kontroller kullanın. Doğru adlandırmayı sağlamak için harcadığınız beş dakika, üretim ortamındaki otomatik yükleme hatalarını gidermek için harcanacak saatlerce süren hata ayıklama çalışmalarını önler.

Sık Sorulan Sorular

Sorularınız mı var?

Bu, Windows ve macOS’ta neden çalışıyor da Linux’ta çalışmıyor?

Windows ve macOS, varsayılan olarak büyük/küçük harf ayrımı yapmayan dosya sistemleri kullanır (NTFS, APFS, HFS+). PHP’nin otomatik yükleyicisi UserRepository.php dosyasını talep ettiğinde, bu sistemler dosya adlarını büyük/küçük harf ayrımı yapmadan değerlendirdikleri için userrepository.php dosyasını döndürürler. Linux ise büyük/küçük harfe duyarlı dosya sistemleri (ext4, xfs) kullanır; bu sistemlerde UserRepository.php ve userrepository.php tamamen farklı dosyalardır. Otomatik yükleyici, tam bir eşleşme aradığı için hata verir.

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

PHP dosyalarını tarayan, yansıma (reflection) veya düzenli ifadeler (regex) kullanarak sınıf adlarını çıkaran ve bunları dosya adlarıyla karşılaştıran bir komut dosyası yazın. Birçok statik analiz aracı, PSR-4 ihlallerini tespit eder. CI/CD ortamında, composer dump-autoload --optimize --strict-psr komutuyla Composer’ın otomatik yükleyici doğrulamasını çalıştırın. Bu işlem, dağıtımdan önce uyuşmazlıkları tespit eder. PhpStorm gibi bazı entegre geliştirme ortamları (IDE’ler), geliştirme sırasında PSR-4 ihlallerini vurgular.

Peki ya özellikler, arayüzler ve soyut sınıflar?

Aynı kural geçerlidir. UserRepositoryInterface adlı bir arayüzün UserRepositoryInterface.php dosyasında bulunması gerekir. Timestampable adlı bir trait için Timestampable.php dosyası gereklidir. Soyut sınıflar da aynı kalıbı izler. PSR-4, sınıf benzeri tüm yapıları aynı şekilde ele alır. Dosya adı, büyük/küçük harf ayrımı da dahil olmak üzere sınıf/trait/arayüz adıyla tam olarak eşleşmelidir.

Dosya adlarında alt çizgi veya tire kullanabilir miyim?

PSR-4 uyumluluğu açısından hayır. PHP sınıf adlarında tire işareti veya çoğu özel karakter kullanılamaz. Alt çizgi işareti teknik olarak sınıf adlarında izin verilir, ancak PSR standartları tarafından önerilmez. Hem sınıf adlarında hem de dosya adlarında PascalCase kuralına uyun: UserRepository, User_Repository veya user-repository değil. PSR-4 kurallarıyla tutarlılık, çerçeve uyumluluğunu sağlar.

Ya bir dosyada birden fazla sınıf varsa?

Bunu yapmayın. PSR-4, her dosya için adları eşleşen tek bir sınıf olmasını gerektirir. Tek bir dosyada birden fazla sınıf bulunması, otomatik yüklemeyi bozar; çünkü otomatik yükleyici, sınıf adları ile dosya yolları arasında 1:1 bir ilişki olmasını bekler. Birbiriyle sıkı bir şekilde bağlantılı sınıflarınız varsa, bunların iç sınıflar mı, ayrı dosyalar mı olması gerektiğini ya da tek bir tutarlı sınıfa yeniden düzenlenip düzenlenmemesi gerektiğini değerlendirin. Her dosya için tek bir sınıf olması, PSR-4’ün temel bir gerekliliğidir.

Bu kuralı ihlal eden eski kodlarla nasıl başa çıkabilirim?

Linux sunucularına dağıtım yapmadan önce tüm uyumsuzlukları giderin; zira uyumsuz dosyalar, üretim ortamında anında otomatik yükleme hatalarına neden olur. Hem sınıfın hem de dosyanın adını aynı anda değiştiren IDE yeniden yapılandırma araçlarını kullanın. macOS’ta, yalnızca büyük/küçük harf farklılığına dayalı ad değişiklikleri iki git commit’i gerektirebilir: önce geçici bir ada (UserRepository_temp.php) değiştirin, commit yapın, ardından doğru büyük/küçük harf düzenine (UserRepository.php) değiştirin. Büyük kod tabanlarında, tüm ihlalleri ayrı bir PR'da düzeltin, kapsamlı bir şekilde test edin, ardından dağıtın. Dosyaları yeniden adlandırdıktan sonra Composer'ın otomatik yükleyicisini güncelleyin (composer dump-autoload).

Ad alanı dosya adını etkiler mi?

Ad alanı, dosya adının kendisini değil, dizin yapısını etkiler. App\\Repositories\\UserRepository adlı bir sınıf, app/Repositories/UserRepository.php dosyasında (veya PSR-4 kök dizinine bağlı olarak src/Repositories/UserRepository.php dosyasında) bulunmalıdır. Ad alanı dizinlere, sınıf adı ise dosya adına karşılık gelir. Her ikisi de PSR-4 kurallarına uymalıdır: ad alanı bölümleri büyük/küçük harf duyarlılığı gözetilerek dizinlere, sınıf adı ise büyük/küçük harf duyarlılığı gözetilerek dosya adına eşleştirilir.

Ş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.