昨日こんな記事書きました
これで、イミュータブルっぽいクラスを作りました。
で、最初にフィードバックをもらった方に、あの記事を見てもらったら、こんな記事をおすすめしていただきました。
参考記事
あれー?昨日の記事よりわかりやすくて、内容が入ってるよー\(^o^)/
さすがsuinさんですね……!
実装書き換えてみる
class User { private $name; private $status; public function __construct(string $name, Status $status) { $this->name = $name; $this->status = clone $status; } public function setStatus(Status $status) { $new_instance = clone $this; $new_instance->status = clone $status; return $new_instance; } public function setName(string $name) { $new_instance = clone $this; $new_instance->name = $name; return $new_instance; } }
疑問
privateなフィールドなのに、なんでcloneで別インスタンス作ったのに、フィールド値が書き換えられるの……?
PHP 7.0.0 以降では、新しくクローンしたオブジェクトのメンバーに、作成したその式の中でもアクセスできるようになりました。
し、しらなかったー!!!
ってことで、無事にいい感じのイミュータブルっぽいクラスが出来上がりましたねたぶん!やったー!