上級 › self:: で作ったインスタンスは継承先のサブクラスにならない(static:: との違い) › パターン1
self:: で作ったインスタンスは継承先のサブクラスにならない(static:: との違い)
戻り値の型を static と宣言したメソッドの中で new self() を使うと、呼び出し元がサブクラスであっても常に定義元のクラスのインスタンスが作られます。
1 <?php 2 class Base { 3 public static function create(): static { 4 return new ______(); ^ 5 } 6 } 7 class Derived extends Base {} 8 $obj = Derived::create(); 9 echo get_class($obj);
Fatal error: Uncaught TypeError: Base::create(): Return value must be of type Derived, Base returned in main.php:4
空欄を埋めて実行を通す
戻り値の型はstaticと宣言されているのに、new self()は常に定義元のBaseを作ります。呼び出し時点のクラス(この場合Derived)を作るにはnew static()が必要です。
次の問題