ホームページ  >  記事  >  バックエンド開発  >  new self() と new static() の違いは何ですか

new self() と new static() の違いは何ですか

小云云
小云云オリジナル
2018-01-27 10:50:311851ブラウズ

PHP には区別できない関数がたくさんあります。たとえば、 new self() と new static() の違いは何ですか?もちろん、この打撃は完全には説明されていないかもしれませんが、この記事では PHP の new self() と new static() の違いについて説明します。

1.new static() は、PHP5.3 バージョンで導入された新機能です。

2. new static() または new self() のどちらでも、新しいオブジェクトが作成されます。

3. これら 2 つのメソッドの new によって生成されるオブジェクトの違いは何ですか? 端的に言えば、new によって生成されるオブジェクトは同じクラス インスタンスですか、それとも別のクラス インスタンスですか?

上記の問題を調べるために、簡単なコードから始めましょう:


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());

この親クラスには 2 つのサブクラスがあるため、これらの 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_PHP チュートリアルの new self() の詳細な説明

new static() と new self() staticself

new static() の類似点と相違点は何ですか?対処方法

以上がnew self() と new static() の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。