Verstehen Sie die Variablenzuweisung in PHP wirklich?

藏色散人
Freigeben: 2023-04-10 17:00:01
nach vorne
3728 Leute haben es durchsucht

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();
Nach dem Login kopieren

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;
Nach dem Login kopieren

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]
Nach dem Login kopieren

$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'
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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
Nach dem Login kopieren

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonVerstehen Sie die Variablenzuweisung in PHP wirklich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!