php.net http://www.php.net/manual/en/language.oop5.late-static-bindings.php says:
从 PHP 5.3.0 开始,PHP 实现了一项称为后期静态绑定的功能,该功能可用于在静态继承上下文中引用被调用的类。
更准确地说,后期静态绑定通过存储最后一个“非转发调用”中命名的类来工作。对于静态方法调用,这是显式命名的类(通常是 :: 运算符左侧的类);对于非静态方法调用,它是对象的类。 “转发调用”是一种静态调用,由 self::、parent::、static:: 引入,或者,如果在类层次结构中向上,则由forward_static_call() 引入。函数 get_used_class() 可用于检索带有被调用类名称的字符串,并且 static:: 引入其范围。
从内部角度考虑,此功能被命名为“后期静态绑定”。 “后期绑定”来自这样一个事实:static:: 不会使用定义该方法的类来解析,而是使用运行时信息来计算。它也被称为“静态绑定”,因为它可用于(但不限于)静态方法调用。
自我的局限性:
对当前类的静态引用,如 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 的关键字。决定不引入新的关键字,而是使用已经保留的 static。
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Here comes Late Static Bindings
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
上面的例子将输出:B
$this
关键字引用当前对象,不能在静态方法中使用它。当你说return $this
这意味着某个方法返回调用它的同一对象。
所以正确的方法是使用static
关键字因为如果你说return new static()
它指的是该方法当前所在的类。