这个标题估计很多人都不屑一顾,变量赋值?打扰一下?我们将吸取发展的第一课,好吗?然而,这样基础的东西会让很多人感到困惑,比如值和引用的关系。今天,我们就来详细说说。首先,定义变量和赋值就不用多说了。$a=1;$b='2';$c=[4,5,6];$d=新的stdClass();四个变量分别定义了整数、字符串和数组的对象。这些是我们每天处理的四种类型。然后,变量给变量赋值。$a1=$a;$b1=$b;$c1=$c;$d1=$d;请注意,前三个任务是正常任务,即特定内容的副本。当我们修改$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,即第二个数为5,当然不会影响$arr1。对象形式的引用赋值呢?//对象是引用赋值classA{public$name='IamA';}$a=newA();$b=$a;echo$a->name,PHP_EOL;//'我是A'echo$b->name,PHP_EOL;//'我是A'$b->name='我是B';echo$a->name,PHP_EOL;//'IamB'不出所料,$b修改了name属性的内容后,$a中的name也变成了$b修改的内容。在这种情况下,如果对象不想通过引用传递,一种是使用原型模式的__clone()来制作自己的副本。二是对外创新。//使用克隆解决引用传递问题classChild{public$name='我是A1的下属';}classA1{public$name='我是A';公共$孩子;函数__construct(){$this->child=newChild();}函数__clone(){$this->name=$this->name;//可以使用new或Child的克隆//$this->child=newChild();$this->child=clone$this->child;}}$a1=newA1();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修改Content$b1->child->name='我是B1的下属';echo$a1->name,PHP_EOL;//a1成为b1的内容echo$a1->child->name,PHP_EOL;//使用__clone$b2=clone$b1;//b2cloneb1$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中的赋值问题,尤其是普通赋值和引用赋值问题有了更深入的学习和理解。下次看代码和框架的时候可以关注一下别人是怎么灵活使用这两个赋值的。你也可以尝试用这两种方法来修改你写的bug!测试代码: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.phphttps://www.php.net/manual/zh/language.oop5.cloning.php可在各媒体平台搜索【硬核项目经理】
