3
<?php

class T {
        public function x(){
                return true;
        }    
}
var_dump(T::x());

class X {
        public function x(){
                return true;
        }

}    
var_dump(X::x());

このコードの結果は次のとおりです。

bool(true)
PHP Fatal error:  Non-static method X::x() cannot be called statically in test.php on line 16

T::x() が機能し (失敗するはずなのに)、X::x() が失敗するのはなぜですか?

4

1 に答える 1

3

X::x()クラスと同じ名前を共有しているため、実際には PHP4 スタイルのコンストラクターです。また、静的な方法でクラスのコンストラクターを呼び出すと、致命的なエラーが発生します。

非静的メソッド X::x() を静的に呼び出すことはできません。互換性のないコンテキストからの $this を想定しています。

実装でわかるように、これは実際にはすべての非静的マジック メソッドに当てはまります。

暗黙的に静的に呼び出される (そして が発生するE_STRICT) 可能性がある唯一のケースは、関数に特別な処理がない場合です。

if (some large if/else's for the magic methods) {
    // flag isn't set…
} else {
    CG(active_op_array)->fn_flags |= ZEND_ACC_ALLOW_STATIC;
}
于 2013-10-10T18:24:31.113 に答える