İsim çözünürlük kuralları

(PHP 5 >= 5.3.0, PHP 7)

İsim çözünürlük kurallarının amaçları gereği bazı önemli tanımlar:

İsim alanı adı tanımları
Nitelenmemiş isim

Fan gibi bir isim alanı ayracı içermeyen bir betimleyici.

Nitelenmiş isim

Fan\Fin gibi bir isim alanı ayracı içeren bir betimleyici.

Tamamen nitelenmiş isim

\Fan\Fin gibi bir isim alanı ayracı ile başlayan isim alanı ayraçlı bir betimleyici. \Fan isim alanı da tamamen nitelenmiş bir isimdir.

Göreli isim

namespace\Fan\Fin gibi namespace ile başlayan bit tanımlayıcıdır.

İsimler şu kurallara göre çözümlenir:

  1. Tamamen nitelenmiş isimler daima önünde ters bölü imi olmayan isimlere çözümlenir. Örneğin, new \A\B deyimi A\B sınıfı olarak çözümlenir.
  2. Göreli isimler ise daima namespace\ öneki geçerli isim alanı ile değiştirilerek çözümlenir. Eğer isim küresel isim alanındaysa namespace\ öneki konmaz. Örneğin, X\Y isim alanındaki namespace\A, X\Y\A olarak çözümlenirken aynı isim küresel isim alanı içindeyse A olarak çözümlenir.
  3. Nitelenmiş isimlerde ismin ilk bölümü geçerli sınıf/isimalanı ithal tablosuna göre dönüştürülür. Örneğin, A\B\C isim alanı C olarak ithal edilmişse C\D\E ismi A\B\C\D\E ismine dönüştürülür.
  4. Nitelenmiş isimlerde ithal kurallarına göre dönüştürülmeyen tüm isimlerin önüne geçerli isim alanı ismi getirilir. Örneğin, A\B isim alanınındaki bir C\D\E ismi A\B\C\D\E ismine dönüştürülecektir.
  5. Nitelenmemiş isimler derleme sırasında ilgili türün geçerli ithal kurallarına göre dönüştürülür. Yani, sınıf benzeri isimler sınıf/isimalanı ithal tablosuna göre, işlevler işlev ithal tablosuna göre, sabitler sabit ithal tablosuna göre dönüştürülür. Örneğin, use A\B\C; sonrasında new C() gibi bir kullanım A\B\C() olarak çözümlenir. benzer şekilde, use function A\B\fn; sonrasında fn() gibi bir kullanım A\B\fn ismine dönüştürülür.
  6. İthal kuralları uygulanamayan nitelenmemiş sınıf benzeri isimler geçerli isim alanı ile öncelenerek dönüştürülür. Örneğin, A\B isim alanındaki new C() bildirimi A\B\C ismine çözümlenir.
  7. İthal kuralları uygulanamayan nitelenmemiş işlev veya sabit benzeri isimler ve küresel isim alanı dışındaki kod isimleri çalışma sırasında çözümlenir. Kodun A\B isim alanında olduğunu varsayalım, foo() işlev çağrısı şöyle gerçekleşir:
    1. Geçerli isim alanında A\B\fan() işlevi aranır.
    2. Küresel fan() işlevi bulunmaya ve çağrılmaya çalışılır.

Örnek 1 - Örneklerle İsim Çözünürlüğü

<?php
namespace A;
use 
B\DC\as F;

// işlev çağrıları

fan();      // Varsa "A" isim alanında tanımlı "fan", yoksa küresel "fan"

\fan();     // Küresel alanda tanımlı "fan" çağrılır

my\fan();   // "A\my" isim alanında tanımlı "fan" çağrılır

F();        // Varsa "A" isim alanında tanımlı "F", yoksa küresel "F"

//sınıf adı çağrıları

new B();    // Varsa "A" isim alanında tanımlı "B" örneklenir
            // Yoksa "A\B" sınıfı özdevinimli olarak yüklenmeye çalışılır

new D();    // ithal kuralları ile, "B" isim alanında tanımlı "D" örneklenir
            // yoksa "B\D" sınıfı özdevinimli olarak yüklenmeye çalışılır

new F();    // ithal kuralları ile, "C" isim alanında tanımlı "E" örneklenir
            // yoksa "C\E" sınıfı özdevinimli olarak yüklenmeye çalışılır

new \B();   // Varsa küresel alanda tanımlı "B" örneklenir
            // yoksa "B" sınıfı özdevinimli olarak yüklenmeye çalışılır

new \D();   // Varsa küresel alanda tanımlı "D" örneklenir
            // yoksa "D" sınıfı özdevinimli olarak yüklenmeye çalışılır

new \F();   // Varsa küresel alanda tanımlı "F" örneklenir
            // yoksa "F" sınıfı özdevinimli olarak yüklenmeye çalışılır

// başka bir isim alanından duruk yöntem/isim alanı işlevleri

B\fan();    // "A\B" isim alanında tanımlı "fan" çağrılır

B::fan();   // "A" isim alanında tanımlı "B" sınıfının "fan" yöntemi çağrılır
            // "A\B" sınıfı yoksa, "A\B" özdevinimli yüklenmeye çalışılır

D::fan();   // ithal kuralları ile, "B" isim alanında tanımlı "D" sınıfının
            // "fan" yöntemi çağrılır; "B\D"  sınıfı yoksa, "B\D"
            // özdevinimli yüklenmeye çalışılır

\B\fan();   // "B" isim alanında tanımlı "fan" çağrılır

\B::fan();  // Küresel alandaki "B" sınıfının "fan" yöntemi çağrılır
            // "B" sınıfı yoksa, "B" özdevinimli yüklenmeye çalışılır

// geçerli isim alanının duruk yöntemleri ve isim alanı işlevleri

A\B::fan();   // "A\A" isim alanında tanımlı "B" sınıfının "fan" yöntemi
              // çağrılır; "A\A\B" sınıfı yoksa, "A\A\B" özdevinimli
              // yüklenmeye çalışılır

\A\B::fan();  // "A" isim alanında tanımlı "B" sınıfının "fan" yöntemi
              // çağrılır; "A\B" sınıfı yoksa, "A\B" özdevinimli yüklenmeye
              // çalışılır
?>