Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
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 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ımAnlamıÖrnekNe zaman kullanılır?
Kısa adMevcut namespace'e göre çözülürnew User('Ada')Sınıf aynı veya içe aktarılmışsa
Tam adBelirli namespace açıkça yazılırnew \App\Model\User('Ada')Tek seferlik veya açık kullanımda
Global adKök namespace'ten başlarnew \DateTimeImmutable()Global sınıfı kesin belirtmekte
Takma adUzun adı dosya içinde kısaltıruse 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:

  1. Aşağıdaki içeriği namespace-example.php adıyla kaydedin.
  2. Komut satırında php namespace-example.php komutunu çalıştırın.
  3. 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.

Sık sorulan sorular​

use takma adı, metin içindeki sınıf adını da değiştirir mi?​

Hayır. İçe aktarma ad çözümleme aşamasında etkilidir; 'User' gibi dinamik string değerleri kendiliğinden tam ada çevrilmez. Dinamik kullanımda uygun tam sınıf adını veya User::class gibi çözülmüş sınıf adı ifadesini kullanın.

Global fonksiyon bulunurken global sınıf neden bulunmuyor?​

Namespace içindeki nitelendirilmemiş fonksiyon ve sabit adlarında global alana geri dönüş kuralları vardır. Sınıf adları için aynı otomatik geri dönüşü varsaymayın; global sınıfı use ile aktarın veya başına ters bölü koyun. Sembol türüne göre ad çözümleme farklıdır.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic