2011-06-01 17 views
6

"static ::" anahtar kelimesinin etrafında bazı PHP üzerinde çalışıyordum ve çok fazla statik çağrının bir yöntemin bulunduğu yerdeki karışıklığa neden olduğu bir sorunla karşılaştı. Bu örnekle göstermek daha kolaydır:Olası PHP hatası statik: PHP 5.3.3

class Class1 
{ 
    function Test() 
    { 
     return Class2::Test(); 
    } 
} 

class Class2 
{ 
    function Test() 
    { 
     return static::Test2(); 
    } 

    function Test2() 
    { 
     return true; 
    } 
} 

/* test 1: calling Class1::Test() statically results in expected call to Class2::Test2() */ 
echo "test 1: " . Class1::Test() . "\n"; 

/* test 2: instantiating the class causes Class1::Test2() to be called, which does not exist */ 
$Class1 = new Class1(); 
echo "test 2: " . $Class1->Test() . "\n"; 

dışarı ulaşmak ve bu gerçek bir hata ya da dilin basit kötüye olup olamayacağını söyleyebilir PHP uzmanların görüş almak istedik.

Kurulumun tüm statik çağrılarda tuhaf olabileceğini biliyorum, ancak karşılaştığım gerçek kodu temsil ediyor.

Lütfen daha fazla bilgi veya açıklama gerekirse lütfen bildirin. Şimdiden herhangi bir yardım için teşekkürler!

+1

Hangi PHP sürümünü kullanıyorsunuz? statik anahtar kelimesi 5.3 –

+0

'a kadar uzatılmamıştı. Sanırım bunun gerçekten statik anahtar kelimeyle ilgili bir hata olup olmadığını ve tüm statik bağlantı noktasının çalışmanın "nasıl" yapıldığı soruluyor. – LLBBL

+0

5.3.3 –

cevap

7

late static bindings üzerindeki PHP belgeleri sorunuzu yanıtlıyor.

statik yöntem çağrıları durumunda olmayan yönlendirme çağrısı ' "geç statik bağlamaları son adlandırılmış sınıf depolayarak çalışmak', bu açıkça adlandırılmış sınıf (:: solunda genellikle biridir Statik olmayan yöntem çağrıları durumunda, nesnenin sınıfıdır: "Yönlendirme çağrısı", self ::, parent ::, static :: "ile tanıtılan statik birdir." ...

Test 1'iniz statik aramadır, bu nedenle Class2::Test() çağrıldığında Class2 depolanır. Statik test2 araması Class2'da doğru yere işaret eder.

Test 2'niz statik olmayan bir çağrıdır, bu nedenle nesnenin sınıfını her durumda kullanır ve Class1 olduğu için Test2 yöntemini bulamaz.

+0

numaralı telefonu çalıştırmadan bahsetmeyi unuttum Referans için teşekkürler, özellikle bu örneği belgelerde açıklıyorlar. Ancak, şimdi bunun rapor edilmesi gereken bir hata olup olmadığını merak etmeliyim? Düşünceler? –

+0

@Jeff Neden bir hata olur? Tam olarak istedikleri gibi görünüyor. Hangi davranışları beklerdiniz ve neden daha doğrudur? (Bunları bir hata raporunda da açıklamanız gerekir.) – Tesserex

+0

İlk olarak, PHP iç çalışmalarında pek fazla insan olmadığı için özür dilerim. Örneğimde, kodun Class2 :: Test2() sınıfından $ Class1-> Test() -> Class2 :: Test() -> Class2 :: Test2() yoluyla elde edilmesi bekleniyordu. Bu makul bir beklenti mi? –