龍鈞
2017-08-12 19:29
我就想知道,在什么情况下,后面这段代码是true?【if ($a === $b) echo '==='; 】
想不到什么情况他们是全等的。
上面的如果没看懂,我就简单说下我的理解
$a = new Car();
$b = new Car();
这两段值一样但是内存地址不一样,所以判断不是全等
$a = $b = new Car(); 这一句 看起来跟上一句没差别,但是程序执行的时候是$a是先创建一个指针 指向NULL,然后看$b 有没有指向 如果有就直接指向$b 的地址。所以他们的值和内存都是一样的。
$a = new Car();
$b = new Car();
$a = $b = new Car();
a.x = a = {n:2},我们可能会这么想:
1.先把 {n:2} 赋值给 a 2.然后再创建 a.x,将 {n:2} 再赋值给 a.x12
这样似乎确实说不通 a.x
的值是 undefined
,因为 a.x
确实是被赋值了的啊。
可事实上,a.x
的值就是 undefined
。
再来看一下: a = a.x = {n:2}
,按照上面的思路来看的话,应该是:
1.先把 {n:2} 赋值给 a.x,那么也就相当于 b.x = {n:2} 2.再把 a 重新指向 {n:2}。那么这时候 a.x 的值确实是 undefined,a 对象 {n:2} 中就没有 x 属性嘛。12
按照这种思路,上述两种方式的结果应该是不同的,但事实却是a = a.x = {n:2}
和a.x = a = {n:2}
的结果是一致的,所以我们想的那种赋值的思路是不对的。
事实上,解析器在接受到 a = a.x = {n:2} 这样的语句后,会这样做:
找到 a 和 a.x 的指针。如果已有指针,那么不改变它。如果没有指针,即那个变量还没被申明,那么就创建它,指向 null。
a 是有指针的,指向 {n:1};a.x 是没有指针的,所以创建它,指向 null。
然后把上面找到的指针,都指向最右侧赋的那个值,即 {n:2}。
希望有所帮助
$a = new Car();
$b = clone($a); //克隆
$c = &$a; //引用
使用clone的时候是克隆一个新实例,实例号不一样(用var_dump可以查看),此时$a==$b;
引用时,$a === $c。
补充:定义一个变量,系统会给变量$variable分配一个内存空间,假设$a = &$variable; $b = &$variable; 我们就说$a,$b是$variable的两个引用。而引用不再分配内存空间。
---------------完毕-----------------
当我们用
if ($a === $b) echo '===';
这条语句的时候就会输出true
if ($a->name === $b->name) echo '==='; //true
上面返回就是真,这个教程做的确实不好,很多地方说的很模糊。
举个例子吧
人是一个类,这能理解吧。
但是同卵双胞胎能说他们的基因(类中的属性和方法)相同,但是并不能说他们完全相同对吧,起码根据出生时间一个大一个小。
换成代码
$a=new Car(),$b=new Car,分别用var_dump输出,可以直观的看出区别,这里就不发截图了,而且动一下收印象更深嘛。
而我是一个精神分裂患者,我自己有n个我,这n个我不光基因相同,除了代号(实例名),什么都相同,因为我是同一个人。别钻牛角尖说什么眼神不同啊。
换成代码
本体$a=new Car(),另一重人格$b,但还是我,所以$b=$a,再有一重人格也同理,$c=$a,这时候这个if就成立了
这个在项目中怎么应用呢?我也没用过........就只是在前边那个通过私有初始化函数来控制实例的创建的那一课用来检查第二次创建的实例和第一次的是不是同一个实例(结果是true).....
全等不只是数值相等,数据类型也相等。比如数值123和字符串“123”
$b=$a;
PHP进阶篇
181836 学习 · 2577 问题
相似问题