Ich denke, viele Leute werden diesen Titel ablehnen, Variablenzuweisung? Verzeihung? Lasst uns die erste Lektion der Entwicklung lernen, okay? Allerdings können solche grundlegenden Dinge viele Menschen verwirren, etwa das Verhältnis von Werten und Referenzen. Lassen Sie uns heute ausführlich darüber sprechen.
Zuallererst ist es selbstverständlich, dass das Definieren von Variablen und das Zuweisen von Werten
$a = 1; $b = '2'; $c = [4, 5, 6]; $d = new stdClass();
Vier Variablen definieren Objekte von Ganzzahl, Zeichenfolge bzw. Array. Dies sind auch die vier Typen, mit denen wir täglich zu tun haben.
Dann weist die Variable der Variablen einen Wert zu.
$a1 = $a; $b1 = $b; $c1 = $c; $d1 = $d;
Bitte beachten Sie, dass es sich bei den ersten drei Aufgaben um normale Aufgaben handelt, also um Kopien bestimmter Inhalte. Wenn wir $a1 ändern, ändert sich $a nicht. $a1 ist der neu geöffnete Speicherplatz, der unseren Wert enthält. Mit anderen Worten: Ihre Werte sind gleich, aber die Speicheradressen sind unterschiedlich. Es sind nur zwei Menschen, die gleich aussehen und nichts miteinander zu tun haben.
Aber $d1 und $d sind nicht nur die gleichen, sondern auch die Speicheradressen. Diese Situation nennen wir Referenzzuweisung. Wenn sich $d1 ändert, ändert sich auch $d2.
Sie können Folgendes sagen: Referenzzuweisung besteht darin, eine Verknüpfung unter Windows oder einen Softlink unter Linux für die Originalvariable zu erstellen.
Veranschaulichen Sie anhand konkreter Beispiele zunächst die Zuweisung gewöhnlicher Werte:
// 普通赋值 $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 hat keinen Einfluss auf den Wert von $v. $arr2 ändert den Index 1, das heißt, die zweite Zahl ist 5. Dies hat natürlich keine Auswirkungen auf $arr1.
Und wie sieht es mit der Referenzvergabe in Objektform aus?
// 对象都是引用赋值 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'
Wie erwartet änderte sich, nachdem $b den Inhalt des Namensattributs geändert hatte, auch der Name in $a in den von $b geänderten Inhalt.
Wenn das Objekt in diesem Fall nicht als Referenz übergeben werden soll, muss man __clone() verwenden, den Prototypmodus, um eine eigene Kopie zu erstellen. Die zweite besteht darin, von außen etwas Neues zu schaffen.
// 使用克隆解决引用传递问题 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;
Der Verweis auf Objekte kann Menschen wirklich verwirren. Insbesondere bei komplexeren Objekten weisen die internen Eigenschaften verschiedene Verweise auf andere Objekte auf. In diesem Fall müssen Sie sorgfältig prüfen, ob die Referenzzuweisung zu Problemen führt. Wenn es Probleme gibt, verwenden Sie neue Objekte oder Klontechnologie, um Referenzprobleme zu lösen.
Zum Schluss, entspannen Sie sich, die Zuweisung von Referenzvariablen ist die gleiche wie bei der Übergabe von Referenzparametern an Methoden, verwenden Sie einfach ein &-Symbol!
// 引用赋值 $b = &$v; $b = '3'; echo $v, PHP_EOL;
Heute haben wir eine eingehendere Untersuchung und ein tieferes Verständnis der Zuweisungsprobleme in PHP, insbesondere der Probleme der gewöhnlichen Zuweisung und der Referenzzuweisung. Wenn Sie sich das nächste Mal den Code und das Framework ansehen, können Sie darauf achten, wie andere diese beiden Zuweisungen flexibel nutzen. Sie können auch versuchen, mit diesen beiden Methoden die von Ihnen geschriebenen Fehler zu beheben!
测试代码: 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
Empfohlenes Lernen: „PHP-Video-Tutorial“