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

リファレンス

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



リファレンスを返す

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



週間人気ページランキング / 3-22 → 3-28
順位 ページタイトル抜粋 アクセス数
1 コード例 … 「例外処理」はネストすることができる 9
2 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 8
2 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 8
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 8
3 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 7
4 PHPで定数を定義する方法は2種類ある / 配列定数の定義 6
4 curl で Cookie を使用する 6
5 Fatal error: Call to undefined method MDB2_Error::execute() in ○○ on line △△ | Fatal error(エラーメッセージ) 5
6 Warning: PDO::query(): LOAD DATA LOCAL INFILE forbidden | Warning(エラーメッセージ) 4
7 スコープ | 変数 3
8 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column | Fatal error(エラーメッセージ) 2
8 Trying to get property of non-object  | Notice(エラーメッセージ) 2
8 定数 2
8 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 2
8 ガベージコレクション | 機能 2
8 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 2
8 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 2
8 Fatal error: Uncaught Wrench\Exception\HandshakeException: No accept header receieved on handshake response in ★★★ headless-chromium-php/vendor/wrench/wrench/lib/Wrench/Protocol/Protocol.php | エラーメッセージ 2
8 Composer | 依存関係マネージャ 2
8 PHP用語 2
2024/3/29 1:01 更新