2010-11-25 19 views
10

Son zamanlarda bazı sınıf dosyaları üzerinde çalıştım ve üye değişkenlerin korumalı statik modda korumalı statik $ _someVar gibi ayarlandığını ve statik :: $ _ someVar gibi erişildiğini fark ettim.Korumalı statik üye değişkenleri

Görünürlük kavramını anlıyorum ve korunan statik olarak ayarlanmış bir öğeye sahip olmak, üye değişkenine yalnızca süper sınıf veya türetilmiş sınıflarda erişilebilmesini sağlar, ancak korumalı statik değişkenlere yalnızca statik yöntemlerle erişebilir miyim?

Teşekkür

cevap

33

Doğru bir şekilde anlıyorsam, kime başvurduğunuza late-static bindings adı verilir. Eğer bu varsa:

class A { 
    static protected $_foo = 'bar'; 

    static public function test() { 
     echo self::$_foo; 
    } 
} 

class B extends A { 
    static protected $_foo = 'baz'; 
} 

B::test(); // outputs 'bar' 

Eğer değiştirirseniz self bit için:

echo static::$_foo; 
Sonra

yapın:

B::test(); // outputs 'baz' 

self$_foo tanımlandı sınıfı (A) ifade eder Çünkü static, çalışma zamanında (B) adlı sınıfı referans alır.

Ve tabi ki, statik görünürlük ve kapsamın hala geçerli olmasına rağmen statik korumalı üyelere statik yöntem (ör.: Object context) dışında erişebilirsiniz.

+2

Bu örnekte B sınıfının "B sınıfı A uzaması" olması gerektiğini düşünüyorum. –

+0

@Nathan: İyi çağrı (haftalar sonra bile). Sabit. Teşekkürler! – netcoder

6

Statik değişkenler yerine sınıfın örneklerinde daha, sınıf mevcut.

self::$_someVar 

bu self oldukça geçerli örneği (gibi $this) daha geçerli sınıfına yapılan bir gönderme olmasıdır işleri nedeni: Sen gibi onlara bir şey çağrılırken, statik olmayan yöntemlerle onlara erişebilirsiniz. Gösterim amacıyla

:

<? 
class A { 
    protected static $foo = "bar"; 

    public function bar() { 
    echo self::$foo; 
    } 
} 

class B extends A { } 

$a = new A(); 
$a->bar(); 

$b = new B(); 
$b->bar(); 
?> 

Çıktı barbar olduğunu. Ancak, doğrudan erişmeyi denerseniz:

echo A::$foo; 

Sonra PHP düzgün korumalı bir üyesini erişmeye çalıştıkları için size şikayet edecektir.

+0

Öyleyse neden kendi kendini statik olarak kullanıyorsunuz? Örneğin. self :: $ foo or static :: $ foo –

+0

Evet, ders dışında çalışırken evet, ancak bir sınıf yönteminde erişirken bahsedeceğim. –

+0

A-> foo() öğesini tanımlar ve "self :: $ foo" ifadesini çağırırsanız, bu, A'da tanımlanan statik $ foo'yu döndürür. A'yı A'nın bir parçası olarak A sınıfı altından ayırırsanız, devralınan foo'yu çağırır (), eğer B üzerinde tanımlamış olsanız bile, A'dan $ foo kullanacaktır. Statik :: $ foo kullanmak, eğer yapmış olsaydınız, B üzerinde tanımlanan $ foo'yu kullanırdı. –

İlgili konular