2010-11-25 7 views
10

Ich habe vor kurzem an einigen Klassendateien gearbeitet und festgestellt, dass die Membervariablen in einem geschützten statischen Modus wie protected static $ _someVar gesetzt wurden und wie static :: $ _ someVar zugegriffen wird.Geschützte statische Membervariablen

Ich verstehe das Konzept der Sichtbarkeit und dass etwas als geschütztes statisch festgelegt wird sicherstellen, dass die Elementvariable kann nur in der Super-Klasse oder abgeleiteten Klassen zugegriffen werden, aber kann ich geschützte statische Variablen nur in statischen Methoden zugreifen?

Dank

Antwort

33

Wenn ich richtig verstehe, heißt das, was Sie beziehen, late-static bindings. Wenn Sie diese haben:

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' 

Wenn Sie das ändern self Bit:

echo static::$_foo; 

Dann tun:

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

Da self der Klasse bezieht, in dem $_foo definiert wurde (A) , während static die Klasse referenziert, die sie zur Laufzeit aufgerufen hat (B).

Und natürlich können Sie statische geschützte Mitglieder außerhalb einer statischen Methode (d. H. Objektkontext) zugreifen, obwohl Sichtbarkeit und Umfang noch wichtig sind.

+2

Ich denke, die Klasse B sollte in diesem Beispiel "Klasse B erweitert A" sein. –

+0

@Nathan: Guter Anruf (auch Wochen später). Fest. Vielen Dank! – netcoder

6

Statische Variablen existieren auf der Klasse und nicht auf Instanzen der Klasse. Sie können sie von nicht-statische Methoden zugreifen, sie so etwas wie den Aufruf:

self::$_someVar 

Der Grund, dies funktioniert, ist, dass self ein Verweis auf die aktuelle Klasse ist, anstatt auf die aktuelle Instanz (wie $this).

Als Demonstration:

<? 
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(); 
?> 

Ausgang ist barbar. Jedoch, wenn Sie versuchen, direkt darauf zuzugreifen:

Dann wird sich PHP bei Ihnen richtig beschweren, wenn Sie versuchen, auf ein geschütztes Mitglied zuzugreifen.

+0

Okay, also warum sollte man self over static verwenden? Z.B. Selbst :: $ foo oder statisch :: $ foo –

+0

Oh ja, wenn Sie außerhalb der Klasse versuchen, aber ich spreche über beim Zugriff auf es innerhalb einer Klassenmethode. –

+0

Wenn Sie A-> foo() definieren und 'self :: $ foo' aufrufen, wird das in $ definierte statische $ foo zurückgegeben. Wenn Sie A als Teil von B ableiten, rufen Sie das geerbte foo auf (), wird $ foo von A verwendet, selbst wenn Sie es auf B definiert haben. Wenn Sie static :: $ foo verwenden, würden Sie das auf B definierte $ foo verwenden, wenn Sie dies getan hätten. –