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

リファレンス

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



リファレンスを返す

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



週間人気ページランキング / 5-28 → 6-3
順位 ページタイトル抜粋 アクセス数
1 PHP用語 19
2 Fatal error: Cannot use assign-op operators with overloaded objects nor string offsets | Fatal error(エラーメッセージ) 4
3 セッションID | セッション 3
4 Fatal error: require_once(): Failed opening required 'XML/RSS.php' | Fatal error(エラーメッセージ) 2
4 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 2
4 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
4 foreach文 | 制御構造 2
4 「static修飾子」付与 → クラスメソッド 2
4 具体例 2
4 変数と定数の相違点 2
4 セッション期限 2
4 定義済みの定数 / 拡張モジュールの「定義済み定数」 2
4 静的(スタティック)変数 | 変数 2
4 ログイン 2
5 「定義」「宣言」違い | 変数 1
5 トレイト | クラスとオブジェクト 1
5 セッション・ハイジャック | セキュリティ 1
5 Fatal error: Class '**' not found in ○○ on line △△ | Fatal error(エラーメッセージ) 1
5 「try~catch」「set_error_handler」を組み合わせるメリット 1
5 Desktop applications only support the oauth_callback value 'oob' | エラーメッセージ 1
2026/6/4 5:05 更新