PHP的变量赋值
发布时间:2023-12-22 11:56:40 所属栏目:PHP教程 来源:DaWei
导读: 今天这篇给大家分享的知识是“深入理解PHP的变量赋值,有哪些知识点”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“深入理解P
今天这篇给大家分享的知识是“深入理解PHP的变量赋值,有哪些知识点”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“深入理解PHP的变量赋值,有哪些知识点”文章能帮助大家解决问题。 首先,定义变量和赋值这个不用多说了吧 $a = 1; $b = '2'; $c = [4, 5, 6]; $d = new 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产生影响。 那么对象形式的引用赋值呢? // 对象都是引用赋值 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里面的name也变成了$b所修改的内容。 在这种情况下,如果对象想要不是引用传递的,一是使用__clone(),也就是原型模式来进行自己的拷贝。二是从外面重新new一个呗。 // 使用克隆解决引用传递问题 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; 对象的引用这一块确实会容易让人蒙圈。特别是更加复杂的对象,内部的属性还有各种引用其他对象的时候。这种情况下一定要仔细确认引用赋值会不会带来问题,如果有问题,就使用新对象或者克隆技术进行引用问题的处理。 (编辑:源码门户网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐