おそらく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これが言語の誤解に関連する私のグリッチである場合-私に知らせてほしい、私が間違っていることを知りたい。

Source: https://habr.com/ru/post/J98496/


All Articles