オブジェクト指向 PHP における new self() と new static() の違いは次のとおりです。 new self() によって返されるインスタンスは変更されず、常に同じクラスのインスタンスを返します。発信者が決定します。
new static()はPHP5.3バージョンで導入された新機能です。 new static() であっても new self() であっても、新しいオブジェクトは新しいものです。これら 2 つの方法で new によって生成されるオブジェクトの違いは何ですか?次の記事で紹介します。
PHP オブジェクト指向における new self() と new static() の違い
この問題を調査するために、まず簡単なコードを実行してみましょう:
class Father { public function getNewFather() { return new self(); } public function getNewCaller() { return new static(); } } $f = new Father(); print get_class($f->getNewFather()); print get_class($f->getNewCaller());
上記の get_class() メソッドに注意してください。コードは、インスタンスが属するクラス名を取得するために使用されます。
ここでの結果は次のようになります: getNewFather() または getNewCaller() の呼び出しに関係なく、Father クラスのすべてのインスタンスが返されます。
出力された結果は次のとおりです: FatherFather
この時点では、 new self() と new static() の間に違いはないようです。続けてみましょう:
class Sun1 extends Father { } class Sun2 extends Father { } $sun1 = new Sun1();$sun2 = new Sun2(); print get_class($sun1->getNewFather()); print get_class($sun1->getNewCaller()); print get_class($sun2->getNewFather()); print get_class($sun2->getNewCaller());
さて、Father クラスには 2 つのサブクラスがあるため、Father クラスの getNewFather() と getNewCaller() はこれら 2 つのメソッドを継承します。
出力結果は次のとおりです:
FatherSun1FatherSun2
Sun1 であっても Sun2 であっても、getNewFather() を呼び出して返されるオブジェクトは Father クラスのインスタンスであるのに対し、getNewCaller() は呼び出し元のインスタンスを返すことがわかりました。
つまり、$sun1 は Sun1 クラスのインスタンスを返し、$sun2 は Sun2 クラスのインスタンスを返します。
new self() と new static() の違いが理解できた気がします。
まず、両者の違いは継承にのみ反映されます。継承が存在しない場合、両者の間に違いはありません。
すると、 new self() が返すインスタンスは何千年も変化せず、誰が呼び出しても同じクラスのインスタンスを返しますが、 new static() は呼び出し元によって決定されます。
上記の $sun1->getNewCaller() の呼び出し元は $sun1 ですよね! $sun1 はクラス Sun1 のインスタンスであるため、返されるのはクラス Sun1 のインスタンスです。$sun2 と同じ理由は繰り返されません。
関連知識の詳細については、PHP 中国語 Web サイト をご覧ください。 !
以上がPHP オブジェクト指向の new self() と new static() の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。