Bir PHP isim alanı sınıfları, fonksiyonları ve sabitleri bir önek altına koyar, böylece adları başkasınınkiyle çakışamaz. Onu bir dosyanın ilk deyimi olarak namespace App\Models; ile tanımlarsınız ve diğer dosyalar sınıfa \App\Models\User olarak başvurur ya da onu use App\Models\User; ile içe aktarıp yalnızca User yazar.
İsim alanının içinde User App\Models\User demektir. User::class hiçbir şey oluşturmadan tam adı bir dizge olarak verir; bu, loglama ve otomatik yükleyiciler için kullanışlıdır.
Bir dosyada iki isim alanı
Gerçek bir proje her dosyaya bir isim alanı koyar. Kendi içinde bütün bir demo için, her biri süslü parantezle sarıldığında bir dosya birkaç isim alanı tutabilir. Hiçbir isim alanına ait olmayan kod namespace { } içine girer:
Order adlı iki sınıf yan yana yaşar, çünkü tam adları farklıdır. Kütüphaneler kurduğunuzda isim alanlarının çözdüğü sorun tam olarak budur: sizin Order sınıfınız, bir ödeme kütüphanesinin Order sınıfı ve bir PDF kütüphanesinin Order sınıfı artık çakışmaz.
use ile içe aktarma ve as ile takma ad
Her yerde \Shop\Order yazmak kalabalık yaratır. Bir dosyanın (veya isim alanı bloğunun) başındaki use bir adı içe aktarır, böylece kısa biçimi kullanabilirsiniz. İki içe aktarma aynı kısa adla bitecekse as onlardan birine farklı bir ad verir:
use yalnızca dosyanın geri kalanı için kısa bir ad oluşturur. Bir dosya yüklemez veya kod çalıştırmaz ve sınıf henüz var olsun ya da olmasın aynı şekilde çalışır. Gruplanmış içe aktarmalara da izin verilir: use Shop\{Order, Invoice};.
use function ve use const
Bir isim alanındaki fonksiyonlar ve sabitler use function ve use const ile içe aktarılır:
Global sınıflar ters eğik çizgi ister
Bir isim alanının içinde nitelenmemiş bir sınıf adı o isim alanına göre çözümlenir, bu yüzden namespace App; içindeki new DateTime() App\DateTime arar. Fonksiyonlar ve sabitler farklıdır: App\strlen yoksa PHP global strlen fonksiyonuna geri döner. Sınıflar asla geri dönmez.
catch (\Error $e) aynı nedenle bir ters eğik çizgi gerektirdi: o olmadan PHP App\Error arar, gerçek hatayla asla eşleşmez ve betik yakalanmamış bir Error ile dururdu. Bunu ya yukarıdaki gibi baştaki bir ters eğik çizgiyle ya da dosyanın başına use DateTime; ekleyerek düzeltin. Aynısı \Exception, \Throwable ve diğer her yerleşik sınıf için de geçerlidir; onları yakalamak için try catch sayfasına bakın.
Otomatik yükleme ve PSR-4
Bir projede her sınıf kendi dosyasında yaşar ve dosya yolu isim alanını takip eder. PSR-4 bu kuraldır: bir isim alanı öneki bir temel klasöre eşlenir ve adın geri kalanı yol olur. spl_autoload_register() ile kaydedilen bir otomatik yükleyici, sınıf ilk kullanıldığında sınıf dosyasını yükler. Bu blok diske iki sınıf dosyası yazar ve onları otomatik yükler:
Her sınıf dosyası, sınıfa ilk ihtiyaç duyulduğu anda bir kez yüklenir. Gerçek projelerde bu fonksiyonu kendiniz yazmazsınız: Composer onu composer.json içindeki birkaç satırdan üretir:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
composer dump-autoload sonrasında giriş betiğinizin başındaki tek bir require __DIR__ . '/vendor/autoload.php'; her App\... sınıfını ihtiyaç anında yükler.
Hatalara yol açan isim alanı kuralları
namespacedosyadaki ilk deyim olmalıdır. Ondan önce yalnızcadeclare(strict_types=1);ve yorumlar gelebilir.useiçe aktarmaları dosya başınadır. Bir sınıfıindex.phpiçinde içe aktarmak kısa adın dahil edilen bir dosyanın içinde çalışmasını sağlamaz; her dosyanın kendiusesatırları olmalıdır.usedosyanın veya isim alanı bloğunun en üst seviyesine aittir. Bir sınıf gövdesinin içindeusebaşka bir şey demektir: bir trait içeri alır.- Dizgeler asla çözümlenmez:
$class = 'User'; new $class();globalUsersınıfını arar. Tam adı, tercihenUser::classile saklayın.
Sonuncusu hızlı bir kontrolü hak ediyor:
Sıkça Sorulan Sorular
PHP'de namespace nedir?
İlişkili sınıfları, arayüzleri, fonksiyonları ve sabitleri gruplayan bir önektir, adlar için bir klasör gibi. Bir dosyanın başındaki namespace App\Models; o dosyanın User sınıfını App\Models\User konumuna koyar, böylece başka bir kütüphanenin User sınıfıyla çakışamaz.
PHP'de use ne işe yarar?
Bir dosyanın başındaki use App\Models\User; o dosyada tam ad \App\Models\User yerine User yazmanızı sağlar. Hiçbir şeyi yüklemez veya dahil etmez; sınıf dosyasını yüklemek otomatik yükleyicinin işidir. use ... as Alias; farklı bir kısa ad seçer.
Bir namespace içinde neden Class not found alıyorum?
namespace App; içinde çıplak bir sınıf adı isim alanına göre çözümlenir, bu yüzden new DateTime() App\DateTime arar. new \DateTime() yazın ya da başa use DateTime; ekleyin. Fonksiyonlar ve sabitler otomatik olarak global isim alanına geri döner, sınıflar dönmez.
PHP'de bir sınıf adından önceki ters eğik çizgi nedir?
Baştaki bir ters eğik çizgi adı global isim alanından başlayan tam nitelikli bir ad yapar: \Exception kod hangi isim alanında olursa olsun her zaman PHP'nin yerleşik Exception sınıfıdır. O olmadan ad mevcut isim alanına ve use içe aktarmalarına göre çözümlenir.
İsim alanlarının klasörler ve PSR-4 ile ilişkisi nedir?
PHP'nin kendisi isim alanlarını klasörlere bağlamaz. Bunu yapan PSR-4 kuralıdır: App\ gibi bir önek src/ gibi bir dizine eşlenir, böylece App\Models\User src/Models/User.php dosyasında yaşar. Composer'ın otomatik yükleyicisi bu kurala uyar, ikisinin genellikle eşleşmesinin nedeni budur.