状態:-
閲覧数:5,266
投稿日:2010-05-06
更新日:2016-03-21
◆変数の割り当て - 「割り当てられた(オブジェクト型)変数」は「元(オブジェクト型)変数」と共通のリファレンスを持っているわけではなく、同じオブジェクトとして振る舞うよう“割り当て”られた変数に過ぎない。そのため、「値変更」の影響は相互に受けるが、「新オブジェクト生成」の影響は相互に受けない
◆リファレンスの結びつけ - 「結び付けられた(オブジェクト型)変数」は「元(オブジェクト型)変数」と共通のリファレンスを持つ、同じオブジェクトを指すようセットされている。そのため、「値変更」「新オブジェクト生成」の影響を、相互に受ける
◆クローン(コピー) - クローン(コピー)すると、元オブジェクトの関連性はなくなる(「値変更」「新オブジェクト生成」の影響を受けない)
書式 - 「$c = clone $a;」代入演算子「=(イコール)」の後に「clone」を付与
[/code]
▼結果
/demo/object2.html
「PHP4」と「PHP5」では、同じ書き方をしていても、意味が異なる場合がある。下記は、その一例。
▽PHP4 オブジェクトのクローン(コピー)
↓
▽PHP5 オブジェクトの割り当て
※PHP5で、オブジェクトのクローン(コピー)を行なう際には、下記書き方が必須
◆リファレンスの結びつけ - 「結び付けられた(オブジェクト型)変数」は「元(オブジェクト型)変数」と共通のリファレンスを持つ、同じオブジェクトを指すようセットされている。そのため、「値変更」「新オブジェクト生成」の影響を、相互に受ける
◆クローン(コピー) - クローン(コピー)すると、元オブジェクトの関連性はなくなる(「値変更」「新オブジェクト生成」の影響を受けない)
書式 - 「$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;