php5からオブジェクトだけは参照渡しがデフォルトになったようです。
つまり何も考えずに$hoge = $huga;で渡しておけば良いという結論に至りました。
通常の変数で値を変更したい関数だけ参照を使えば良いですね。
■ c++による値渡しと参照渡しのサンプル
ポイント
・ コピーの場合
→ローカル変数が不要になった時点でデストラクタが実行される
・ 参照の場合
→ローカルの参照変数が不要になってもデストラクタは実行されない
という動作になる事をとりあえず覚えておきます。
■ phpによる値渡しと参照渡しサンプル
ポイント
・コピーするにはcloneという命令を明示的に使用する。
・明示的コピー(clone)ではデストラクタが動作する。
この場合でも内部メンバがオブジェクトであれば参照となる。
・オブジェクトが値渡し(コピー)の時の問題点。
例えばDBオブジェクトを考えます。
内部でDBへの接続情報を色々と所持しています。
(PostgreSQLならlibpq-fe.hのPGconnでも見ると色々と勉強になるハズ)
このオブジェクトのデストラクタでコネクションを切断しているとしたら?
値渡しされてしまうと関数内で想定外のDisConnectが実行され、DBセッションがKILLされます。
呼び出し元で、切断されたコネクションに対して処理を継続したりw
オブジェクトの実装方法によりますが、内部で再接続してたりすると目も当てられませんよねw
・$hoge = $huga;でも参照渡しになる
サンプルでは関数の引数のみ注目しましたが、これも参照渡しとなります。
大体こんな事が想像できる
PHPの内部でデータ型を保持しており、オブジェクト型の時のみ参照値を返しています。
(これはVariant型:COMのVT_VARIANT等を検索すると分かりやすいでしょう)
12/17追記:何でも型というのはVariant型しか知らなかったので引き合いに出したが、PHPのマニュアルからも読み取れた。
第 53章Creating Variables、内部的な持ち方が記載されている。
PHPの変数自体が一つのオブジェクトであるとして、
変数オブジェクトのコピーコンストラクタと=オペレータ演算子で
if (data_type == object)
参照渡しの処理;
else
値渡しの処理
みたいな処理が内部的に行われている事が想像できます。
|