为了账号安全,请及时绑定邮箱和手机立即绑定

我就想知道,在什么情况下,后面这段代码是true?【if ($a === $b) echo '==='; 】

我就想知道,在什么情况下,后面这段代码是true?【if ($a === $b) echo '==='; 】


想不到什么情况他们是全等的。

正在回答

8 回答

上面的如果没看懂,我就简单说下我的理解

$a = new Car();

$b = new Car();

这两段值一样但是内存地址不一样,所以判断不是全等

$a = $b = new Car(); 这一句 看起来跟上一句没差别,但是程序执行的时候是$a是先创建一个指针 指向NULL,然后看$b 有没有指向 如果有就直接指向$b 的地址。所以他们的值和内存都是一样的。

0 回复 有任何疑惑可以回复我~

$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} 这样的语句后,会这样做:

  1. 找到 a 和 a.x 的指针。如果已有指针,那么不改变它。如果没有指针,即那个变量还没被申明,那么就创建它,指向 null。

  2. a 是有指针的,指向 {n:1};a.x 是没有指针的,所以创建它,指向 null。

  3. 然后把上面找到的指针,都指向最右侧赋的那个值,即 {n:2}。

希望有所帮助

0 回复 有任何疑惑可以回复我~
#1

新手村上路

。。。一脸懵圈,不明觉厉啊
2019-01-07 回复 有任何疑惑可以回复我~

$a = new Car();

$b = clone($a);   //克隆

$c = &$a;  //引用

使用clone的时候是克隆一个新实例,实例号不一样(用var_dump可以查看),此时$a==$b;

引用时,$a === $c。

0 回复 有任何疑惑可以回复我~

补充:定义一个变量,系统会给变量$variable分配一个内存空间,假设$a = &$variable; $b = &$variable; 我们就说$a,$b是$variable的两个引用。而引用不再分配内存空间。

---------------完毕-----------------

当我们用

if ($a === $b) echo '===';

这条语句的时候就会输出true

0 回复 有任何疑惑可以回复我~

if ($a->name === $b->name) echo '==='; //true

上面返回就是真,这个教程做的确实不好,很多地方说的很模糊。

1 回复 有任何疑惑可以回复我~

举个例子吧


人是一个类,这能理解吧。

但是同卵双胞胎能说他们的基因(类中的属性和方法)相同,但是并不能说他们完全相同对吧,起码根据出生时间一个大一个小。

换成代码

$a=new Car(),$b=new Car,分别用var_dump输出,可以直观的看出区别,这里就不发截图了,而且动一下收印象更深嘛。


而我是一个精神分裂患者,我自己有n个我,这n个我不光基因相同,除了代号(实例名),什么都相同,因为我是同一个人。别钻牛角尖说什么眼神不同啊。

换成代码

本体$a=new Car(),另一重人格$b,但还是我,所以$b=$a,再有一重人格也同理,$c=$a,这时候这个if就成立了


这个在项目中怎么应用呢?我也没用过........就只是在前边那个通过私有初始化函数来控制实例的创建的那一课用来检查第二次创建的实例和第一次的是不是同一个实例(结果是true).....

0 回复 有任何疑惑可以回复我~
#1

慕数据4083019

还是我....这里纠正一下,最后那个‘私有初始化函数’不准确,应该说‘私有初始化方法’..........
2017-11-13 回复 有任何疑惑可以回复我~
#2

慕尼黑123390 回复 慕数据4083019

那方法和函数到底是什么区别呢?
2018-10-22 回复 有任何疑惑可以回复我~

全等不只是数值相等,数据类型也相等。比如数值123和字符串“123”

0 回复 有任何疑惑可以回复我~
#1

慕粉1720382552

对于普通类型来说,值相等和类型相等,===就会判断为true。比如 $a=123;$b=123 $a===$b会是真。 这种情况放到本次作业上就不适用了,但教程中提到‘当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断。’,我联想到了前面学到的两种赋值运算符,其中提到“=&:引用赋值,意味着两个变量都指向同一个数据。它将使两个变量共享一块内存,如果这个内存存储的数据变了,那么两个变量的值都会发生变化。”,所以,对于不同对象来说,要想实现$a === $b判断为true,需要引用赋值$b=&$a,用clone方法是不行的。
2017-08-26 回复 有任何疑惑可以回复我~

$b=$a;

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

我就想知道,在什么情况下,后面这段代码是true?【if ($a === $b) echo '==='; 】

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信