エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【php】イミュータブルなクラスのフィードバック対応をしてみる【498日目】

昨日こんな記事書きました

www.nyamucoro.com

これで、イミュータブルっぽいクラスを作りました。

で、最初にフィードバックをもらった方に、あの記事を見てもらったら、こんな記事をおすすめしていただきました。

参考記事

qiita.com

qiita.com

あれー?昨日の記事よりわかりやすくて、内容が入ってるよー\(^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: オブジェクトのクローン作成 - Manual

PHP 7.0.0 以降では、新しくクローンしたオブジェクトのメンバーに、作成したその式の中でもアクセスできるようになりました。

し、しらなかったー!!!

ってことで、無事にいい感じのイミュータブルっぽいクラスが出来上がりましたねたぶん!やったー!