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

リファレンス

 状態:-  閲覧数:5,313  投稿日: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;



リファレンスを返す

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



週間人気ページランキング / 1-30 → 2-5
順位 ページタイトル抜粋 アクセス数
1 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 10
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 9
3 curl で Cookie を使用する 4
3 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 4
3 PHPで定数を定義する方法は2種類ある / 配列定数の定義 4
4 コード例 … 「例外処理」はネストすることができる 3
4 Warning: PDO::query(): LOAD DATA LOCAL INFILE forbidden | Warning(エラーメッセージ) 3
4 http_build_queryとは? / 構文 /パラメータ 3
4 Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | エラーメッセージ 3
5 Fatal error: Cannot redeclare 関数名() (previously declared in ファイル名:○○) in ファイル名 | Fatal error(エラーメッセージ) 2
5 Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'データベースユーザー名'@'localhost' (using password: YES)' | phpMyAdmin(データベース関連) 2
5 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 2
5 new clone違い | 演算子 2
5 オブジェクト関係マッピング | データベース関連 2
5 array_filter | 配列 2
6 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 1
6 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 1
6 セッション単位 | セッション 1
6 htmlspecialchars / htmlentities / addslashes / mysql_real_escape_string / mysqli_real_escape_string | セキュリティ 1
6 dirname() / (__FILE__ ) / basename( dirname( __FILE__ ) ); | 関数 1
2025/2/6 1:02 更新