2011-07-20 23 views
8

Önceki bir çalışan tarafından yazılan bir PHP sınıfıyla karşılaştım:Sınıf kendini mi uzatıyor?

namespace SomeNamespace; 

class SomeClass extends ::SomeClass 
{ 
    private function __construct() {} 

    public static function someFunction() 
    { 
     //Do something 
    } 
} 

Birisi burada neler olduğunu açıklar mı lütfen? Bu sınıf kendini mi uzatıyor? Bir singleton'un özel bir kurucu kullanacağını biliyorum, ama burada olup bitenlerden emin değilim.

Gerçek sınıf, önbelleğe alma ile ilgili. İşe yarayacağından emin değilim.

+2

Hata olmadan yürütülür mü? ve her iki sınıfın aynı isim alanında olduğundan emin misiniz? – zzzzBov

+2

İyi soru! Daha önce hiç böyle bir kod görmedim. Önceki çalışan bir dahi ya da çılgın bir kişiydi. – GordonM

+0

Şu anda sınıfı yürütmek konusunda isteksizim. Ama evet!Sınıf tanımının üzerindeki bir isim alanını tanımlayan bir satır var (bu sorunu yansıtacak şekilde güncelledim). –

cevap

6

Bu tür bir işlemi ::; \

Sadece PHP PHP 5.3.5 ile test - ve :: kullanarak gerçekten bana bir hata alıyor: ancak bu ad ayırıcı kullanıyorsanız çalışması gerekir.
\ 'yi kullanmak, diğer yandan, (bkz. Aşağıdaki örnek). Benim örnekte SomeNamespace denilen özel bir ad alanında,

namespace { 

    class SomeClass 
    { 
     public function method() { 
      var_dump("child: " . __METHOD__); 
     } 
    } 


    $obj = new SomeNamespace\SomeClass(); 
    $obj->method(); 

} 


Ve: Sınıf SomeClass tanımlayabiliriz (herhangi bir spesifik ad alanının dışında) genel ad olmak Örneğin


, Sınıfı global ad alanından genişleten bir sınıf tanımlayabilirsiniz - bu, \SomeClass:

namespace SomeNamespace { 

    class SomeClass extends \SomeClass 
    { 
     public function method() { 
      var_dump("parent: " . __METHOD__); 
     } 
    } 

} 


Sidenote: Burada, ben de aynı dosyada kodun iki porsiyon koyuyorum olarak, bracketed syntax kullanmak ettik (yani manuel sayfadaki Örnek 3) - ama olması gerektiği Sadece birkaç dosya ile aynı çalışır.



PHP 5.3 ilk alfa sürümleri ile, ad ayırıcı değil \ olduğunu Not ama PHP 5.3 alfa 1 veya 2 (kullanıyorsanız Yani ::

, ve belki 3, \ alfa 3 önce veya sonra seçilmiştir emin değil, :: kullanarak işe yarayabilir.

(Elbette, bir alfa kullanılarak olmamalıdır - özellikle iki yıldır PHP 5.3 stabil versiyonlarını yaşandığını göz önünde bulundurarak) Ben 5,3 geliştirilmesi sırasında doğru hatırlayarak olsam

+0

'dan önce Evet! PHP'nin bir alfa sürümünü kullanıyoruz. Bu konuda yorum yapmaya gerek yok :-) –

+2

Ergh, gerçekten gerçekten gerçekten bir alfa üzerinde çalışmamalısın - özellikle böyle eski bir! Kararlı bir sürüme geçiş yaptığınız gün, tüm alan kodlarınız bozulacak ... * (üzgünüm, yorum yapamayacağımı söyleyemedim ^^ Sevindim, yine de) * –

+0

Haha evet bu korkunç! –

2

İsim alanı ayırıcısı olarak :: kullanıldı.

İlgili konular