从PHP 5.3.0开始,PHP增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。
静态绑定:static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。
self:: 的限制
使用self:: 或者 __CLASS__对当前类的静态引用,始终都是指定义当前方法所在的类
<?php
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();
//输出A
后期静态绑定的用法
后期静态绑定试图通过引入一个关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用test()时引用的类是B而不是A。最终决定不引入新的关键字,而是使用已经预留的static关键字。
<?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 ();
//输出B
注意: static:: 在处理静态方法时与 $this 是不同的。 $this-> 会遵循继承规则,但是 static:: 不会。该差异将稍后在本手册中详细说明。<?php
class TestChild extends TestParent {
public function __construct() {
static::who();
}
public function test() {
$o = new TestParent();
}
public static function who() {
echo __CLASS__."\n";
}
}
class TestParent {
public function __construct() {
static::who();
}
public static function who() {
echo __CLASS__."\n";
}
}
$o = new TestChild;
$o->test();
//TestChild
//TestParent
后期静态绑定的处理方式解决了以往完全没有办法解决的静态调用。另外一方面,如果静态调用使用parent:: 或者 self:: 将转发调用信息。
<?php
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();
//A
//C
//C