競馬鹿ねっと
 
since
2000.1.1〜
ヤエノムテキ
http://www.keibaka.net
メールはこちら メールはアイコンをクリック!

競馬
 ┣ トップページ
 ┣ 開発日誌とか♪
 ┗ 熱い競馬漫画
  SouKaSILa
  NKV

 
Developer
 ◆ 過去の遺物
 ◆ KBN_IPAT5
 ◆ KBN_IPAT4 08/06/01
 ◆ PHP5
 ┣ PHPの優位性
 ┣ ガベージコレクタ
 ┣ 値渡しと参照渡し
 ┃┣ Cサンプル
 ┃┗ PHPサンプル
 ◆ オープンソース
 ┣ KBN_AIBO
 ┃┗ document
 ┗ IIS_AUTH_ADO
 ◆ 無償サポート
 
その他
 ◆ 映画とか 06/05/10
 ◆ 北斗の拳 06/04/04
 
PC
 ◆ SOTEC WL7160A
 
ウォッチリンク
 ◆ スラッシュドット
 ◆ ボトムズ
 
利用させて頂いた順に並んでいます。
XREA
競馬鹿ねっとはXREAを利用して運営されています。
Yuko's Gallery
Yuko's Gallery様のフリー画像を利用させて頂いてます。
Aomusi'sWorld
Aomusi'sWorld様のフリー画像を利用させて頂いてます。
 
値渡しと参照渡し 最終更新日:2005.12.17



  値渡しと参照渡しを何故意識するのか?
デストラクタがどのタイミングで呼び出されるかというお話です。


値渡しと参照渡しについて

  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
  値渡しの処理
みたいな処理が内部的に行われている事が想像できます。



Copyright 競馬鹿ねっと