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.