6

このメッセージは、奇妙な理由でphp5.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

抽象静的メソッドは、一種の奇妙な概念です。静的メソッドは、基本的にメソッドをクラスに「ハード コード」し、インスタンスが 1 つだけ (~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 に答える