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