おそらくPHPのバグか、機能かもしれません...

...そして多分-夕方までに疲れた私の頭のバグ-))



PHP 5.3.1を試してみてください。バージョン5.3.2は確認できませんでした。



最も単純なコード:

abstract class First {



function init() {

echo static::DIR;

}



}



class Second extends First {



const DIR = 'test';



}



Second::init(); // "test"









開始しますが、予想通り「テスト」を受け取ります。 これは論理的です。 最近登場したLSB機能を使用していますが、すべてが正常に機能します。



OK、さらにコードを追加します。



class Third {



function test() {

Second::init(); // "test"

}



}



$third = new Third();

$third->test();









個人的に、私の$ third-> test()メソッドは致命的なエラーを呼び出します:未定義のクラス定数。



xdebugの出力から判断すると、インタープリターはFirst :: init()に正常に到達しますが、LSBの明示的な使用にもかかわらず、First :: DIR定数を検出しません。



どうする パニックと地獄。



必要なのは、キーワード「静的」をFirst :: init()メソッドの定義に追加することだけです。



ここにそのような興味深い機能があります。



マニュアルを注意深く読んで、静的として明示的に定義されていないメソッドの静的呼び出しは、E_STRICTレベルの警告のみをトリガーできると結論付けることができます。

「非静的メソッドを静的に呼び出すと、E_STRICTレベルの警告が生成されます。」



判明したように、適切なキーワードを使用することが有用であるだけでなく、重要でもある場合があります。



PSこれが言語の誤解に関連する私のグリッチである場合-私に知らせてほしい、私が間違っていることを知りたい。



All Articles