由于某些奇怪的原因,此消息在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();
}

09-09 18:14