The working principle of late static binding is to store the class name in the previous "non-forwarding call" (non-forwarding call
). When making a static method call, the class name is the one explicitly specified (usually on the left side of the :: operator); when making a non-static method call, it is the class to which the object belongs.
The so-called "forwarding call" (
forwarding call
) refers to static calls made in the following ways:self::
,parent::
,static::
andforward_static_call()
. You can use theget_called_class()
function to get the class name of the called method, andstatic::
points out its scope.
Use
self::
or__CLASS__
for a static reference to the current class, depending Define the class in which the current method is located:
Example:
class A { public static function who () { echo __CLASS__ ; } public static function test () { self :: who (); } }class B extends A { public static function who () { echo __CLASS__ ; } } B :: test ();
Result:
A
Late static binding was intended to circumvent the limitation by introducing a new keyword representing the class that was initially called by the runtime. Simply put, this keyword allows you to refer to class B instead of A when calling test() in the above example. It was finally decided not to introduce new keywords, but to use the already reserved
static
keywords.
Example:
<?phpclass A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 后期静态绑定从这里开始 } }class B extends A { public static function who() { echo __CLASS__; } } B::test();?>
Result:
B
In a non-static environment, what is called The class of is the class to which the object instance belongs. Since
$this->
will try to call the private method in the same scope,static::
may give different results. Another difference is that static properties can only be called withstatic::
.
Example: Calling a private method
<?phpclass A { private function foo() { echo "success!\n"; } public function test() { $this->foo(); static::foo(); } }class B extends A { /* foo() will be copied to B, hence its scope will still be A and * the call be successful */}class C extends A { private function foo() { /* original method is replaced; the scope of the new one is C */ } }$b = new B();$b->test();$c = new C();$c->test(); //fails
Result:
success! success! success! Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
Analysis of late static binding Will continue until a fully parsed static call information is obtained. On the other hand, if the static call is made using
parent::
orself::
the call information will be forwarded.
Example:
class A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; } }class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__."\n"; } }class C extends B { public static function who() { echo __CLASS__."\n"; } } C::test();
Result:
ACC
Related recommendations:
php late static binding example detailed explanation
Detailed description of php static binding
Detailed explanation of the definition and usage of php static binding
The above is the detailed content of PHP implements late static binding. For more information, please follow other related articles on the PHP Chinese website!