- Konu sahibi
- #1
PHP namespace, sınıf, arayüz, trait, fonksiyon ve sabit adlarını mantıksal bir alan içinde gruplandıran adlandırma mekanizmasıdır. En önemli amacı, farklı kütüphane veya modüllerde aynı kısa ada sahip sınıfların çakışmasını önlemektir. Namespace klasör oluşturmaz ve dosyayı otomatik olarak yüklemez; yalnızca PHP'nin sembol adını nasıl yorumlayacağını belirler.
Bir sınıfı namespace içine almak için dosyada sınıf tanımından önce
Bu sınıfın tam adı
Bir namespace içindeki sınıf adı önce o namespace'e göre değerlendirilir. Örneğin
Aşağıdaki kavramlar arasındaki farkı bilmek, namespace hatalarını çözmeyi kolaylaştırır.
Örneğin
Örnek typed property kullandığından PHP 7.4 veya üstü sözdizimi gerektirir; gerçek ortamınızda desteklenen güncel PHP sürümünü tercih edin. Aşağıdaki örnek tek bir PHP dosyasında iki farklı namespace tanımlar ve global bölümde iki sınıfı takma adla kullanır:
Beklenen çıktı şöyledir:
Bu sonuç, iki sınıfın kısa adı aynı olsa da tam adlarının farklı olduğu için çakışmadığını gösterir.
Namespace'i sınıf tanımından sonra yazmak: Bildirilmemiş kod veya sınıf tanımından sonra namespace eklemek sözdizimi hatasına neden olabilir. Namespace bildirimi dosyanın başında olmalıdır; declare gibi izin verilen istisnalar vardır. PHP açılışından önce görünmeyen BOM veya HTML çıktısı da sorun yaratabilir. Bir dosyada birden fazla alan gerekiyorsa örnekteki süslü parantezli namespace biçimini kullanın.
Namespace'i otomatik yükleyici sanmak: Namespace yalnızca isimlendirmeyi düzenler. Sınıf başka dosyadaysa o dosyanın yüklenmesi ayrıca gerekir.
Global sınıfı kendi namespace'inde aramak: Örneğin bir namespace içindeyken
Klasör yapısını namespace sanmak:
Bir sınıfı namespace içine almak için dosyada sınıf tanımından önce
namespace bildirimi kullanılır:
Kod:
<?php
namespace App\Model;
class User
{
public string $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
Bu sınıfın tam adı
App\Model\User olur. User ise sınıfın kısa adıdır. Başka bir namespace içinden sınıfa erişirken tam adı doğrudan yazabilir veya use ile takma ad tanımlayabilirsiniz.Namespace adları nasıl çözümlenir?
Bir namespace içindeki sınıf adı önce o namespace'e göre değerlendirilir. Örneğin
App\Controller içinde yazılan User ifadesi, aksi belirtilmedikçe App\Controller\User sınıfını ifade eder. Başına ters bölü işareti koyulan ad ise global alandan başlar: \DateTimeImmutable.use bildirimi yalnızca bulunduğu PHP dosyasındaki yazımı kısaltır. Sınıfı oluşturmaz, dosyasını yüklemez ve başka dosyalardaki use bildirimlerini etkilemez.Kısa, tam ve takma adlı kullanım
Aşağıdaki kavramlar arasındaki farkı bilmek, namespace hatalarını çözmeyi kolaylaştırır.
| Yazım | Anlamı | Örnek | Ne zaman kullanılır? |
|---|---|---|---|
| Kısa ad | Mevcut namespace'e göre çözülür | new User('Ada') | Sınıf aynı veya içe aktarılmışsa |
| Tam ad | Belirli namespace açıkça yazılır | new \App\Model\User('Ada') | Tek seferlik veya açık kullanımda |
| Global ad | Kök namespace'ten başlar | new \DateTimeImmutable() | Global sınıfı kesin belirtmekte |
| Takma ad | Uzun adı dosya içinde kısaltır | use App\Model\User as ModelUser; | Aynı kısa ad çakıştığında |
Örneğin
Blog\User ve Admin\User sınıfları aynı projede bulunabilir. İkisini tek dosyada kullanırken takma ad vermek çakışmayı açıkça çözer.Çalışan tam örnek
Örnek typed property kullandığından PHP 7.4 veya üstü sözdizimi gerektirir; gerçek ortamınızda desteklenen güncel PHP sürümünü tercih edin. Aşağıdaki örnek tek bir PHP dosyasında iki farklı namespace tanımlar ve global bölümde iki sınıfı takma adla kullanır:
- Aşağıdaki içeriği
namespace-example.phpadıyla kaydedin. - Komut satırında
php namespace-example.phpkomutunu çalıştırın. - Beklenen çıktının iki farklı kullanıcı adı olduğunu kontrol edin.
Kod:
<?php
namespace Blog {
class User
{
public string $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
}
namespace Admin {
class User
{
public string $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
}
namespace {
use Blog\User as BlogUser;
use Admin\User as AdminUser;
$blogUser = new BlogUser('Blog kullanıcısı');
$adminUser = new AdminUser('Yönetici');
echo $blogUser->name, PHP_EOL;
echo $adminUser->name, PHP_EOL;
}
Beklenen çıktı şöyledir:
Kod:
Blog kullanıcısı
Yönetici
Bu sonuç, iki sınıfın kısa adı aynı olsa da tam adlarının farklı olduğu için çakışmadığını gösterir.
use Blog\User as BlogUser ve use Admin\User as AdminUser satırları olmasaydı, global bölümde User yazımı kendiliğinden Blog veya Admin sınıfını seçmez, global User adını arardı. Aynı kısa adla iki farklı use bildirimi yapmak da çakışma hatasına yol açar; bu durumda takma adları değiştirin veya tam ad kullanın.Sık yapılan hatalar
Namespace'i sınıf tanımından sonra yazmak: Bildirilmemiş kod veya sınıf tanımından sonra namespace eklemek sözdizimi hatasına neden olabilir. Namespace bildirimi dosyanın başında olmalıdır; declare gibi izin verilen istisnalar vardır. PHP açılışından önce görünmeyen BOM veya HTML çıktısı da sorun yaratabilir. Bir dosyada birden fazla alan gerekiyorsa örnekteki süslü parantezli namespace biçimini kullanın.
Namespace'i otomatik yükleyici sanmak: Namespace yalnızca isimlendirmeyi düzenler. Sınıf başka dosyadaysa o dosyanın yüklenmesi ayrıca gerekir.
use yazmak tek başına require veya otomatik yükleme işlemi yapmaz.Global sınıfı kendi namespace'inde aramak: Örneğin bir namespace içindeyken
DateTimeImmutable ifadesi beklenmeyen bir sınıf adı çözümüne yol açabilir. Global sınıfı açıkça belirtmek için \DateTimeImmutable yazın.Klasör yapısını namespace sanmak:
App\Model\User adının dosya sisteminde aynı klasörlerde bulunması yaygın bir düzen olsa da PHP namespace'in kendisi klasör oluşturmaz veya dosya eşlemesi yapmaz. Dosya eşlemesi ve otomatik yükleme ayrı bir yapılandırmadır.