概要
- PHPのマニュアルのオブジェクトと参照を読んでみたので自分なりにまとめてみる。
今の自分の知識量
- オブジェクトは参照渡しとはちょっと違うけど似たような振る舞いをすることは知っている。
内容
- 「オブジェクトはデフォルトで参照渡しになります!」とよく言われるけど、厳密に言うと少し違うらしい。
- オブジェクト変数の値にオブジェクトそのものは格納されない。格納されているのはオブジェクトのIDのみ。
- PHPではオブジェクトのIDを用いてオブジェクトにアクセスできるようになっている。
- だからオブジェクト変数を他の変数に更に格納したりしてもオブジェクトのIDが他の変数に格納されるだけなのでオブジェクトIDを用いてオブジェクトを参照すると同じオブジェクトを参照する。
- なのでインスタンス変数の値を他の変数に格納してもオブジェクトID値がコピーされる。結果として同じオブジェクトを指すようになっているだけ。
- 参照渡し:参照先情報を他の変数に渡される。結果同じ値をいじれる。
- オブジェクト:インスタンス変数内のオブジェクトIDが他の変数に渡される。結果アクセスするオブジェクトが同じになる。
- オブジェクトは参照渡しとは一切関係ない!むしろ普通の変数と同じように「格納されている値のコピー」が行われている。ただ、「格納されている値」がオブジェクトIDであり、そのオブジェクトIDをコピーするので同じオブジェクトを閲覧している。
作成下オブジェクトを別ものとしてコピーしたい場合
- オブジェクトを別のオブジェクトとしてコピーしたい場合はクローンを用いる。
追加情報
@error_401 様より下記のご知見を頂きました!
- PHPでは他言語で「参照」といっているものを「リファレンス」と呼んでいます。
-
リファレンスとは同じ変数の内容を異なった名前でコールすることを意味します。ポインタとは異なります。リファレンスは実メモリアドレスでも有りません。
リファレンスとは
-
- さらに他言語で「参照渡し」といっているものを「リファレンス渡し」と呼んでいます。
-
リファレンスにより関数に変数を渡すことが可能です。この場合関数内でその引数を修正可能になります。
リファレンス渡し
-