由于某些奇怪的原因,此消息在php 5.4中显示。
我的课看起来像这样:
abstract class model{
private static
$tableStruct = array();
abstract protected static function tableStruct();
public static function foo(){
if(!isset(self::$tableStruct[get_called_class()]))
self::$tableStruct[get_called_class()] = static::tableStruct();
// I'm using it here!!
}
}
并应按以下方式使用:
class page extends model{
protected static function tableStruct(){
return array(
'id' => ...
'title' => ...
);
}
...
}
为什么认为子类需要使用静态方法是违反标准的?
最佳答案
抽象的静态方法有点奇怪。静态方法基本上将方法“硬编码”给类,确保只有一个实例(〜singleton)。但是将其抽象化意味着您要强制其他一些类来实现它。
我知道您正在尝试做什么,但是在处理抽象类时,我会避免在基类中使用静态方法。您可以做的是使用后期静态绑定(bind)(static::)来调用“子”类中的tableStruct方法。这不会强制方法像抽象方法那样实现,但是您可以测试实现并抛出异常(如果不存在)。
public static function foo(){
// call the method in the child class
$x = static::tableStruct();
}