2

これは、私が扱っているクラスの簡略化されたバージョンです

class A {
   static protected function getVal() {
              return self::$valB;
            }
}
class B extend A {
   static protected $valB = 'Hello';
}
B::getVal(); // Hello

これは php バージョン 5.2.17 で動作するはずですか、それとも設定が間違っていますか? 現在、 が見つからないというエラーが発生していますA::$valB

4

2 に答える 2

3

PHP 5.3.0 以降に存在する遅延静的バインディングが必要です。

http://us3.php.net/manual/en/language.oop5.late-static-bindings.php

return static::valB;getVal では、代わりに使用したいreturn self::valB;

于 2011-06-03T20:55:28.727 に答える
1

まず、コードの構文が間違っています。それを修正することから始めます:

class A {
   static protected function getVal() {
       return self::$valB;
   }
}
class B extends A {
   static protected $valB = 'Hello';
}
B::getVal();

getValが保護されているため、これは機能しません。Aまたはその子のいずれかから呼び出さない限り、機能しません。

selfキーワードは、それを呼び出すクラスに解決されます。以来:selfで使用されAますself == A

それを修正するには、遅延静的バインディングを使用する必要があります。

return static::$valB;

最後に、致命的なエラーを回避するため$valBに、 inも宣言することをお勧めします。A

class A {
    static protected $valB;
    static protected function getVal() { ... }
}
于 2011-06-03T21:01:23.647 に答える