「変数の割り当て」「リファレンスの結びつけ」「クローン(コピー)」違い

リファレンス

 状態:-  閲覧数:5,266  投稿日:2010-05-06  更新日:2016-03-21  
◆変数の割り当て - 「割り当てられた(オブジェクト型)変数」は「元(オブジェクト型)変数」と共通のリファレンスを持っているわけではなく、同じオブジェクトとして振る舞うよう“割り当て”られた変数に過ぎない。そのため、「値変更」の影響は相互に受けるが、「新オブジェクト生成」の影響は相互に受けない



◆リファレンスの結びつけ - 「結び付けられた(オブジェクト型)変数」は「元(オブジェクト型)変数」と共通のリファレンスを持つ、同じオブジェクトを指すようセットされている。そのため、「値変更」「新オブジェクト生成」の影響を、相互に受ける



◆クローン(コピー) - クローン(コピー)すると、元オブジェクトの関連性はなくなる(「値変更」「新オブジェクト生成」の影響を受けない)

書式 - 「$c = clone $a;」代入演算子「=(イコール)」の後に「clone」を付与
 
<pre>
<?php
   class DESIGN{
       var $rolor;
       function DESIGN($rolor){//②コンストラクタDESIGNが呼び出される。その際、「引数$rolor(="赤")」を受け取る
           $this->color = $rolor;//③メンバ変数「$rolor」へ、「引数$rolor(="赤")」値を格納
       }
       function show(){//⑧「メンバ関数show」が呼び出される
           echo " {$this->color}\n";//⑨
       }
       function change($rolor){//⑫「メンバ関数change」が呼び出される。その際、「引数$rolor」を受け取る
           $this->color = $rolor;//⑬メンバ変数「$rolor」へ、「引数$rolor」値を格納
       }
   }
   #インスタンス(オブジェクト)生成
   $n = new DESIGN("赤");//①DESIGNクラスの「インスタンス$n(=オブジェクト型変数$n)」生成。コンストラクタ実行。その際、「引数("赤")」を渡す    
   #■Ⅱ.オブジェクトへのリファレンスの結び付け
   $r =& $n;//④「オブジェクト型変数$r」へ、「オブジェクト型変数$n」のリファレンスを結び付ける

   #■Ⅰ.オブジェクトの割り当て
   $w = $n;//⑤「オブジェクト型変数$r」へ、「オブジェクト型変数$n」のオブジェクトを割り当てる

   #■Ⅲ.オブジェクトのクローン(コピー)を代入
   $c = clone $n;//⑥「オブジェクト型変数$c」へ、「オブジェクト型変数$n」のクローン(コピー)を代入

   echo "■ノーマル「オブジェクト型変数\$n」"; $n->show();//⑦DESIGNクラス「メンバ関数show」実行
   echo "■リファレ「変数\$nのリファレンスを結び付けたオブジェクト型変数\$r」"; $r->show();
   echo "■割り当て「変数\$nのオブジェクトを割り当てたオブジェクト型変数\$w」"; $w->show();
   echo "■クローン「変数\$nのクローン(コピー)を格納したオブジェクト型変数\$c」"; $c->show();

   $str = '$r->change("青");';//⑩「オブジェクト型変数$r」へ対してDESIGNクラス「メンバ関数change」を実行し「引数("青")」を渡すPHPコードを、「変数$str」へ格納
   eval($str);//⑪「変数$str」を評価。「オブジェクト型変数$r」へ対して、DESIGNクラス「メンバ関数change」を実行、「引数("青")」を渡す
   echo "\n▼「リファレンスを結び付けた変数\$r」へ対して、「関数change」を実行し、値変更→ ", $str, "\n";
   echo "\$n"; $n->show();//⑫DESIGNクラス「メンバ関数show」実行
   echo "\$r"; $r->show();
   echo "\$w"; $w->show();
   echo "\$c"; $c->show();

   $str = '$w->change("黄");';//⑬DESIGNクラス「メンバ関数change」実行し、「引数("エージェント赤")」を渡すPHPコードを、「変数$str」へ格納
   eval($str);
   echo "\n▼「オブジェクトを割り当てた変数\$w」へ対して、「関数change」を実行し、値変更→ ", $str, "\n";
echo "\$n"; $n->show();
   echo "\$r"; $r->show();
   echo "\$w"; $w->show();
   echo "\$c"; $c->show();

   $str = '$w = new DESIGN("緑");';
   eval($str);
   echo "\n▼「オブジェクトを割り当てた変数\$w」へ対して、新オブジェクトを生成し、値変更→ ", $str, "\n「変数\$w」は新しいオブジェクトを格納した瞬間、割り当てたオブジェクトが上書きされる。\n";
   echo "\$n"; $n->show();
   echo "\$r"; $r->show();
   echo "\$w"; $w->show();
   echo "\$c"; $c->show();

   $str = '$r = new DESIGN("紫");';
   eval($str);
   echo "\n▼「リファレンスを結び付けた変数\$r」へ対して、新オブジェクトを生成し、値変更→ ", $str, "\n";
   echo "\$n"; $n->show();
   echo "\$r"; $r->show();
   echo "\$w"; $w->show();
   echo "\$c"; $c->show();

   $str = '$r = clone new DESIGN("橙");';
   eval($str);
   echo "\n▼「リファレンスを結び付けた変数\$r」へ対して、新オブジェクトを生成・クロ-ンし、値変更→ ", $str, "\n";
   echo "\$n"; $n->show();
   echo "\$r"; $r->show();
   echo "\$w"; $w->show();
   echo "\$c"; $c->show();

   $str = '$r =& new DESIGN("紺");';
   eval($str);
   echo "\n▼「リファレンスを結び付けた変数\$r」へ対して、新オブジェクトを生成・リファレンスを結び付け、変更→ ", $str, "\n";
   echo "\$n"; $n->show();
   echo "\$r"; $r->show();
   echo "\$w"; $w->show();
   echo "\$c"; $c->show();
?>

[/code]
▼結果

  /demo/object2.html





「PHP4」と「PHP5」では、同じ書き方をしていても、意味が異なる場合がある。下記は、その一例。

▽PHP4 オブジェクトのクローン(コピー)
 
   $a = $b; 「オブジェクト型変数$a」へ、「オブジェクト型変数$b」のクローン(コピー)を格納



▽PHP5 オブジェクトの割り当て
 
   $a = $b;「オブジェクト型変数$a」へ、「オブジェクト型変数$b」のオブジェクトを割り当てる

※PHP5で、オブジェクトのクローン(コピー)を行なう際には、下記書き方が必須
 
$a = clone $b;



リファレンスを返す

コメント投稿(ログインが必要)



週間人気ページランキング / 11-16 → 11-22
順位 ページタイトル抜粋 アクセス数
1 ブラウザを閉じたらセッションデータはどうなるの? | セッション 8
2 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 5
3 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 4
3 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 4
4 PHPで定数を定義する方法は2種類ある / 配列定数の定義 3
4 インポートするデータを受信できませんでした。ファイル名が送信されていないか、ファイルサイズが PHP の設定で許可された最大値を超えています。FAQ 1.16 をご覧ください | エラーメッセージ 3
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 3
4 クラスの継承 | クラスとオブジェクト 3
5 curl で Cookie を使用する 2
5 例外処理 | 制御構造 2
5 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 2
5 関数定義内での「外部ファイル読込」 | 制御構造 2
5 set_error_handler | 例外処理(制御構造) 2
5 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 2
5 コード例 … 「例外処理」はネストすることができる 2
5 PHP用語 2
5 register_shutdown_function | 関数処理 関数 2
6 クロージャ | 関数 1
6 session.cookie_lifetime / session.use_cookies | セッション 1
6 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1
2024/11/23 1:01 更新