Late Static Bindings
As of PHP 5.3.0, PHP implements a feature called late static bindings which
can be used to reference the called class in a context of static inheritance.
This feature was named "late static bindings" with an internal perspective in
mind. "Late binding" comes from the fact that static::
will no longer be resolved using the class where the method is defined but
it will rather be computed using runtime information.
It was also called a "static binding" as it can be used for (but is not
limited to) static method calls.
Limitations of self::
Static references to the current class like self:: or
__CLASS__ are resolved using the class in which the
function belongs, as in where it was defined:
self:: usage
]]>
&example.outputs;
Late Static Bindings' usage
Late static bindings tries to solve that limitation by introducing a
keyword that references the class that was initially called at runtime.
Basically, a keyword that would allow you to reference
B from test() in the previous
example. It was decided not to introduce a new keyword but rather use
static that was already reserved.
static:: simple usage
]]>
&example.outputs;
static:: does not work like $this for
static methods! $this-> follows the rules of
inheritance while static:: doesn't. This difference is
detailed later on this manual page.
static:: usage in a non-static context
test();
?>
]]>
&example.outputs;
Late static bindings' resolution will stop at a fully resolved static call with no fallback.
Fully resolved static calls
]]>
&example.outputs;
Edge cases
There are lots of different ways to trigger a method call in PHP, like
callbacks or magic methods. As late static bindings base their resolution
on runtime information, it might give unexpected results in so-called edge
cases.
Late static bindings inside magic methods
foo;
?>
]]>
&example.outputs;