- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!