phpによると、class :: selfは常にクラス自体を指しますが、これらのコードを書き留めると、何か奇妙なことが起こります。
class C_foo{
function foo() { return "foo() from C_foo"; }
function bar() { echo self::foo(); }
}
class C_bar extends C_foo{
function foo() { return "foo() from C_bar"; }
}
C_foo::bar();
C_bar::bar();
出力は次のようになると思いました。
foo() from C_foo
foo() from C_bar
しかし実際には:
foo() from C_foo
foo() from C_foo
これは、親クラスの自己が子に正確に継承されないことを意味し、次のように機能します。
foo() {return parent::foo();}
それはphpの機能ですか、それともバグですか?それともこのような意味ですか?
それ以外の場合は、クラスにそれ自体からオブジェクトを作成するように指示しようとしたときに、このようなことが発生します。コードは次のようになります。
class Models {
function find($exp) {
...
...
$temp_model = new self();
...
...
}
}
class Something extends Models {...}
$somethings = Something::find("...");
たぶん誰かが「クラスの値で変数を設定し、その変数を__construction関数として使用してみませんか?」と尋ねるでしょう。
このような:
...
...
function find($exp) {
...
...
$class_name = __class__;
$temp_model = new $class_name();
...
...
}
...
実際、私はそれを行い、さらに奇妙な結果を得ました:
これは、クラスにプロパティや関数がない場合にのみ機能しますがfind()
、または、関数が存在するはずの場所に変数が表示されるというエラーが発生した場合にのみ機能します。