6

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

  ...

}

为什么创建子类所需的静态方法被认为是违反标准的?

4

2 回答 2

7

抽象静态方法是一个奇怪的概念。静态方法基本上将方法“硬编码”到类中,确保只有一个实例(~singleton)。但是使其抽象意味着您要强制其他一些类来实现它。

我知道您要做什么,但是在处理抽象类时,我会避免基类中的静态方法。您可以做的是使用后期静态绑定 (static::) 来调用“子”类中的 tableStruct 方法。这不会像 abstract 那样强制实现方法,但您可以测试实现并在不存在时抛出异常。

public static function foo(){
    // call the method in the child class 
    $x = static::tableStruct();
}
于 2012-11-21T14:13:30.453 回答
3

物有所值...

滥用接口:

interface Imodel {

    static function tableStruct();        
}

abstract class model implements Imodel {

    private static $tableStruct = array();

    public static function foo() {
        if (!isset(self::$tableStruct[get_called_class()]))
            self::$tableStruct[get_called_class()] = static::tableStruct();

        // I'm using it here!!
    }
}
于 2014-01-21T07:44:05.080 回答