16

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()、または、関数が存在するはずの場所に変数が表示されるというエラーが発生した場合にのみ機能します。

4

3 に答える 3

34

「後期静的バインディング」として知られるPHP機能を説明しているようです。

PHPには、との2つの構文がself::ありstatic::ます。

staticself多くの人があなたが説明している仕事をすることを期待していたので、PHP5.3で導入されました。

詳細については、PHPのマニュアルを参照してください:http://php.net/manual/en/language.oop5.late-static-bindings.php

構文を使用するnew self()new static()、新しいインスタンスを作成することもできます。

$parent = new self();
$child = new static();
于 2012-04-12T21:18:28.163 に答える
1

これは、親のメソッドを受け取るクラスがそのクラスに属しているためです。それで:

$ barはBarであるため、self::はFooではなくBarを指します。その方法はFooからのものですが。

これはJavaとは異なる場合がありますが、おそらくPHPが内部で継承を行っていることを示しています。

于 2012-04-12T21:09:22.670 に答える
-4

PHPでは、クラスはオブジェクトではありません。そのため、静的メソッドの継承はありません(実際には、それらはグローバル関数に似ています)。

したがって、C_fooがselfと言うとき、それは常にC_fooを意味します(C_barからメソッドを呼び出した場合でも)。

抽象クラスメソッドからインスタンスを作成する場合は、ファクトリパターンを試してください。

于 2012-04-12T21:09:02.687 に答える