このタイトルは多くの人に無視されるかもしれません。変数の割り当て?すみません?開発の最初のレッスンを学びましょう。ただし、値と参照の関係など、このような基本的なことは多くの人を混乱させる可能性があります。今日はそれについて詳しくお話しましょう。
まず、変数の定義と値の割り当てについては言うまでもありません。
$a = 1; $b = '2'; $c = [4, 5, 6]; $d = new stdClass();
4 つの変数は、それぞれ整数、文字列、配列オブジェクトを定義します。私たちが日々扱っているのもこの4種類です。
次に、変数は変数に値を代入します。
$a1 = $a; $b1 = $b; $c1 = $c; $d1 = $d;
最初の 3 つの割り当ては通常の割り当て、つまり特定のコンテンツのコピーであることに注意してください。 $a1 を変更しても、$a は変更されません。 $a1 は、値を保持する新しく開かれたメモリ空間です。つまり、値は同じですが、メモリアドレスが異なります。二人は似ているだけで何の関係もありません。
しかし、$d1 と $d は異なり、値が同じであるだけでなく、メモリ アドレスも同じです。この状況を参照割り当てと呼びます。 $d1 が変更されると、$d2 も変更されます。
次のように言えます: 参照の割り当ては、Windows では元の変数のショートカットを作成するか、Linux ではソフト リンクを作成することです。
具体的な例を使用して説明します。最初は通常の値の割り当てです:
// 普通赋值 $v = '1'; $c = $v; $c = '2'; echo $v, PHP_EOL; // '1' // 数组也是普通赋值 $arr1 = [1,2,3]; $arr2 = $arr1; $arr2[1] = 5; print_r($arr1); // [1, 2, 3]
$c は $v の値に影響しません。 $arr2 は添字 1 を変更します。つまり、2 番目の数値は 5 です。もちろん、$arr1 には影響しません。
それでは、オブジェクト形式での参照割り当てについてはどうでしょうか?
// 对象都是引用赋值 class A { public $name = '我是A'; } $a = new A(); $b = $a; echo $a->name, PHP_EOL; // '我是A' echo $b->name, PHP_EOL; // '我是A' $b->name = '我是B'; echo $a->name, PHP_EOL; // '我是B'
予想どおり、$b が name 属性の内容を変更すると、$a の名前も $b によって変更された内容に変更されました。
この場合、オブジェクトを参照渡ししたくない場合は、独自のコピーを作成するプロトタイプ モードである __clone() を使用します。 2つ目は、外側から新しいものを作ることです。
// 使用克隆解决引用传递问题 class Child{ public $name = '我是A1的下级'; } class A1 { public $name = '我是A'; public $child; function __construct(){ $this->child = new Child(); } function __clone(){ $this->name = $this->name; // new 或者用Child的克隆都可以 // $this->child = new Child(); $this->child = clone $this->child; } } $a1 = new A1(); echo $a1->name, PHP_EOL; // 输出a1原始的内容 echo $a1->child->name, PHP_EOL; $b1 = $a1; echo $b1->name, PHP_EOL; // b1现在也是a1的内容 echo $b1->child->name, PHP_EOL; $b1->name = '我是B1'; // b1修改内容 $b1->child->name = '我是B1的下级'; echo $a1->name, PHP_EOL; // a1变成b1的内容了 echo $a1->child->name, PHP_EOL; // 使用__clone $b2 = clone $b1; // b2克隆b1 $b2->name = '我是B2'; // b2修改内容 $b2->child->name = '我是B2的下级'; echo $b1->name, PHP_EOL; // b1不会变成b2修改的内容 echo $b1->child->name, PHP_EOL; echo $b2->name, PHP_EOL; // b2修改的内容没问题,b1、b2不是一个货了 echo $b2->child->name, PHP_EOL;
オブジェクトへの参照は、確かに人々を混乱させやすいものです。特により複雑なオブジェクトの場合、内部プロパティには他のオブジェクトへのさまざまな参照があります。この場合、参照の割り当てに問題がないかを慎重に確認し、問題がある場合は、新しいオブジェクトやクローン技術を使用して参照の問題に対処する必要があります。
最後に、安心してください。参照変数の割り当ては、参照パラメータをメソッドに渡すときと同じで、& 記号を使用するだけです。
// 引用赋值 $b = &$v; $b = '3'; echo $v, PHP_EOL;
今日は、PHP の代入の問題、特に通常の代入と参照代入の問題について、さらに詳しく学習し、理解しました。次回コードとフレームワークを確認するときに、他の人がこれら 2 つの割り当てをどのように柔軟に使用しているかに注目したり、自分が書いたバグを修正するためにこれら 2 つの方法を使用できるかどうかを試したりすることもできます。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/PHP%E7%9A%84%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC.php 参考文档: https://www.php.net/manual/zh/language.variables.basics.php
推奨学習: 「PHP ビデオ チュートリアル 」