- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章深入浅出理解PHP原理之变量赋值由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
PHP的变量赋值 。
这个标题估计很多人会不屑一顾,变量赋值?excuse me?我们学开发的第一课就会了好不好。但是,就是这样基础的东西,反而会让很多人蒙圈,比如,值和引用的关系。今天,我们就来具体讲讲.
首先,定义变量和赋值这个不用多说了吧 。
1
2
3
4
5
6
7
|
$a
= 1;
$b
=
'2'
;
$c
= [4, 5, 6];
$d
=
new
stdClass();
|
四个变量,分别定义了整型、字符串、数组的对象。这也是我们天天要打交道的四种类型.
然后,变量给变量赋值.
1
2
3
4
5
6
7
|
$a1
=
$a
;
$b1
=
$b
;
$c1
=
$c
;
$d1
=
$d
;
|
请注意,前三个的赋值都是正常的赋值,也就是对具体内容的拷贝。当我们修改$a1的时候$a不会有变化。$a1是新开的内存空间保存了我们的值。也就是说,他们的值是一样的,但内存地址不一样。是两个没啥关系的长得很像的人而已.
但是$d1和$d就不是了,这两货不仅值是一样的,内存地址也是一样的。这种情况就是我们所说的引用赋值。当$d1发生变化时,$d2也会产生变化.
可以这么说:引用赋值就是为原变量建立了一个Windows下的快捷方式或者Linux中的软链接.
用具体的例子来说明,首先是普通值的赋值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// 普通赋值
$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产生影响.
那么对象形式的引用赋值呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// 对象都是引用赋值
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一个呗.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
// 使用克隆解决引用传递问题
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;
|
对象的引用这一块确实会容易让人蒙圈。特别是更加复杂的对象,内部的属性还有各种引用其他对象的时候。这种情况下一定要仔细确认引用赋值会不会带来问题,如果有问题,就使用新对象或者克隆技术进行引用问题的处理.
最后,轻松一下,引用变量的赋值就和我们给方法传引用参数一样的,使用一个&符号就可以啦! 。
1
2
3
4
5
6
7
|
// 引用赋值
$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原理之变量赋值的文章就介绍到这了,更多相关PHP 变量赋值内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.php.cn/php-weizijiaocheng-482289.html 。
最后此篇关于深入浅出理解PHP原理之变量赋值的文章就讲到这里了,如果你想了解更多关于深入浅出理解PHP原理之变量赋值的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!