「clone $thisが書かれた親クラスを継承したとき、小クラスの振る舞いはどうなるのか?」 疑問だったので調べた。
このような継承関係のあるクラスで、
class ParentClass {}
class ChildClass extends ParentClass {}
親クラスにclone $thisを書いたとき、
class ParentClass
{
public function copy(): self
{
return clone $this;
}
}
次のコードで、$objはParentClassになるのか、それともChildClassになるのか?
$child = new ChildClass(); // 小クラス
$obj = $child->copy(); // 親クラスの実装 clone $this が呼ばれる
// $objはParentClass? ChildClass?
正解は、ChildClass。
assert(get_class($obj) === 'ChildClass');