我有一个抽象的超类。
abstract class SuperClass{
public static function loadInstanceFromText(){
$instance = new self();
// do some stuff, etc.
return $instance;
}
}
显然,在引用SuperClass时调用该方法是不可能的,但我也有一个孩子
class ChildClass extends SuperClass{
}
我期望它能够发挥作用。我调用以下函数:
ChildClass::loadInstanceFromText();
但是,它不起作用,因为尝试实例化super,而不是ChildClass。那有什么解决方法吗?因为loadInstanceFromText很复杂,但在所有继承中基本上应该是相同的。
答案 0 :(得分:2)
关键字self
表示声明它的类。因此,在这种情况下,new self()
将创建一个新的SuperClass
,这是不可能的,因为它是抽象的。
另一方面,关键字static
表示调用类。这称为“Late Static Binding”,自版本5.3起支持。因此,您可以使用new static()
,它会按预期创建新的ChildClass
。