Protected static member variables
Static variables exist on the class, rather than on instances of the class. You can access them from non-static methods, invoking them something like:
self::$_someVar
The reason this works is that self
is a reference to the current class, rather than to the current instance (like $this
).
By way of 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();
?>
Output is barbar
. However, if you try to access it directly:
echo A::$foo;
Then PHP will properly complain at you for trying to access a protected member.
If I understand correctly, what you are referring to is called late-static bindings. If you have this:
class A {
protected static $_foo = 'bar';
protected static function test() {
echo self::$_foo;
}
}
class B extends A {
protected static $_foo = 'baz';
}
B::test(); // outputs 'bar'
If you change the self
bit to:
echo static::$_foo;
Then do:
B::test(); // outputs 'baz'
Because self
refers to the class where $_foo
was defined (A), while static
references the class that called it at runtime (B).
And of course, yes you can access static protected members outside a static method (i.e.: object context), although visibility and scope still matters.