Request for Comments: LSB, parent::/self:: forwarding
- Version: 1.0
- Date: 2008-07-22
- Author: Etienne Kneuss colder@php.net
- Status: Implemented in PHP 5.3
Introduction
This RFC covers the change that occured to Late Static Bindings (LSB) prior to its first alpha release.
Terms and concepts
LSB works by passing the original call info to the function, used then by static::
or get_called_class to get the original class name used. This information will only be useful in case a fallback
occurs, which takes place when you call a static method that only exists in one of the parent classes.
<?php class A { public static function who() { return get_called_class(); } } class B extends A { } class C extends B { } echo C::who(); // C ?>
Now let's say that you want to overwrite who in B, but still rely on A's who():
<?php class A { public static function who() { return get_called_class(); } } class B extends A { public static function who() { /* do stuff.. */ /* call A's who() */ } } class C extends B { } echo C::who(); // ?? ?>
Now, depending on how you call A's who()
from B::who()
, you might get different results for the C::who()
call:
- C, if the call was
forwarding
- A, if the call wasn't
forwarding
.
The change
Previously, A::who()
and parent::who()
would be non-forwarding
. The only way to call A's who() with forwarding
was to use an helper function: forward_static_call()
.
With the change, a difference between parent::
and A::
is introduced, that is: parent::
is forwarding
while A::
isn't. Basically, explicit calls are non-forwarding
, but calls using keywords are.
Note that self::
will also be made to be forwarding
, while <nameoftheclass>::
won't.