「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');