6

いくつかの子クラスから呼び出す必要があるクラスに静的関数があります。その関数で使用できるようにするには、呼び出し元の子クラスからの定数が必要です。これらの定数を他の場所で使用できるようにするために、子クラスにはその定数の値を返す関数があります(php5.2.9)。

ただし、親クラスにいるときは、関数を使用したり、直接使用したりすることなく、その定数にアクセスできないようです。それはphp5.2.9でも可能ですか、それとも引数として渡す必要がありますか?

これはコードの単純なバージョンです:

abstract class ParentClass {
    static function DoSomething() {
        $not_working = self::show_const();
        $not_working_either = self::SOME_CONST;

        return 'working';
    }
}

class ChildClass extends ParentClass {
    const SOME_CONST = 'some string';

    function show_const() {
        return self::SOME_CONST;
    }
}

$result = ChildClass::DoSomething();

編集:生成されたエラーは次のとおりです。

  • 未定義のメソッドParentClass::show_const()の呼び出し(関数の場合)
  • 未定義のクラス定数'SOME_CONST'(self :: SOME_CONSTを使用)
4

2 に答える 2

13

残念ながら、あなたがやろうとしていることは 5.3 より前ではうまくいきません。ここでの問題は、早期静的バインディングと後期静的バインディングです。キーワードは早期にselfバインドされるため、シンボルの解決に使用されるクラスのみを検索します。魔法の定数__CLASS__または関数も機能get_class()しません。これらは初期の静的バインディングも行います。このため、PHP 5.3 ではstaticキーワードを拡張して、 として使用した場合の遅延バインディングを意味しstatic::some_method()ます。

したがって、5.3 では次のように動作します。

abstract class ParentClass {
  public static function DoSomething() {
    return static::show_const();
    // also, you could just do
    //return static::SOME_CONST;
  }
}

class ChildClass extends ParentClass {
  const SOME_CONST = 'some string';
  public static function show_const() {
    return self::SOME_CONST;
  }
}

$result = ChildClass::DoSomething();
于 2010-01-23T16:26:25.513 に答える
2

ChildClassに親クラスを拡張させる必要があります::

class ChildClass extends ParentClass {

編集:

子クラスの定数が存在することを知らない親クラスから、子クラスの定数とメソッドを参照しようとしています。これはスコープの問題です。子は親のメソッドと定数を参照できますが、その逆はできません。

于 2010-01-23T15:59:21.727 に答える