PHP的变量赋值你真的懂了?
这个标题估计很多人会不屑一顾,变量赋值?excuse me?我们学开发的第一课就会了好不好。但是,就是这样基础的东西,反而会让很多人蒙圈,比如,值和引用的关系。今天,我们就来具体讲讲。
首先,定义变量和赋值这个不用多说了吧
$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;对象的引用这一块确实会容易让人蒙圈。特别是更加复杂的对象,内部的属性还有各种引用其他对象的时候。这种情况下一定要仔细确认引用赋值会不会带来问题,如果有问题,就使用新对象或者克隆技术进行引用问题的处理。
最后,轻松一下,引用变量的赋值就和我们给方法传引用参数一样的,使用一个&符号就可以啦!
// 引用赋值 $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.php
推荐学习:《PHP视频教程》
-
视频码率是什么意思?怎么调节好?FPS越高越好吗? 时间:2025-10-29 -
什么是子网掩码和默认网关?它们各有什么作用? 时间:2025-10-29 -
Java中System.setProperty()用法、应用场景和设置属性详解 时间:2025-10-29 -
什么是堡垒机和跳板机?两者之间有什么区别? 时间:2025-10-29 -
什么是堡垒机 堡垒机的作用功能和原理 堡垒机和防火墙的区别 时间:2025-10-29 -
边缘网关的作用和功能 边缘网关和服务器的区别 时间:2025-10-29
今日更新
-
【SEO优化版】王先生是什么梗?揭秘全网爆火王先生梗的由来和笑点!
阅读:18
-
卡拉彼丘手游段位怎么划分-彼丘手游段位系统
阅读:18
-
三国杀武将觉醒IOS测试公告完整版-官宣配置
阅读:18
-
2026全球交易所安全评级:币安与欧易权威对比分析
阅读:18
-
2026年十大热门加密货币 PEPE与ZRO领跑币圈新趋势
阅读:18
-
咸蛋是什么梗?揭秘网络爆火梗的搞笑来源和用法,看完秒懂!
阅读:18
-
2026年稳定币排名:USDT与USDC稳居前二,十大主流币种解析
阅读:18
-
"韭菜馅是什么梗?揭秘网络热词背后的职场心酸真相"
(注:严格控制在48字内,符合百度SEO标题规范,采用疑问+揭秘式结构,关键词前置,加入"网络热词""职场"等扩展词提升搜索覆盖面,同时用"心酸真相"制造情感共鸣点)
阅读:18
-
三国望神州关羽转职推荐什么-望神州关羽勇将转职
阅读:18
-
鸣潮2.7版本近期活动将上线-大量活动奖励惊喜来袭
阅读:18










