Do you really understand variable assignment in PHP?

藏色散人
Release: 2023-04-10 17:00:01
forward
3745 people have browsed it

This title may be dismissed by many people. Variable assignment? excuse me? Let’s learn the first lesson of development, okay? However, such basic things can confuse many people, such as the relationship between values ​​and references. Today, let’s talk about it in detail.

First of all, it goes without saying much about defining variables and assigning values.

$a = 1;
$b = '2';
$c = [4, 5, 6];
$d = new stdClass();
Copy after login

The four variables define integer, string, and array objects respectively. These are also the four types we deal with every day.

Then, the variable assigns a value to the variable.

$a1 = $a;
$b1 = $b;
$c1 = $c;
$d1 = $d;
Copy after login

Please note that the first three assignments are normal assignments, that is, copies of specific content. When we modify $a1, $a will not change. $a1 is the newly opened memory space that holds our value. In other words, their values ​​are the same, but the memory addresses are different. They are just two people who look alike and have nothing to do with each other.

But $d1 and $d are not. Not only are the values ​​​​the same, but the memory addresses are also the same. This situation is what we call reference assignment. When $d1 changes, $d2 will also change.

It can be said: Reference assignment is to create a shortcut under Windows or a soft link in Linux for the original variable.

Use specific examples to illustrate. The first is the assignment of ordinary values:

// 普通赋值
$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]
Copy after login

$c will not affect the value of $v. $arr2 modifies subscript 1, that is, the second number is 5. Of course, it will not affect $arr1.

So what about reference assignment in object form?

// 对象都是引用赋值
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'
Copy after login

As expected, after $b modified the content of the name attribute, the name in $a also changed to the content modified by $b.

In this case, if the object does not want to be passed by reference, one is to use __clone(), which is the prototype mode to make its own copy. The second is to create a new one from the outside.

// 使用克隆解决引用传递问题
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;
Copy after login

The reference to objects can indeed easily confuse people. Especially for more complex objects, the internal properties have various references to other objects. In this case, you must carefully confirm whether reference assignment will cause problems. If there are problems, use new objects or cloning technology to deal with reference problems.

Finally, relax, the assignment of reference variables is the same as when we pass reference parameters to methods, just use an & symbol!

// 引用赋值
$b = &$v;
$b = '3';
echo $v, PHP_EOL;
Copy after login

Today we have a more in-depth study and understanding of the assignment issues in PHP, especially the issues of ordinary assignment and reference assignment. When you look at the code and framework next time, you can pay attention to how others use these two assignments flexibly. You can also try to see if you can use these two methods to fix the bugs you have written!

测试代码:
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
Copy after login

Recommended learning: "PHP Video Tutorial"

The above is the detailed content of Do you really understand variable assignment in PHP?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
php
source:segmentfault.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template