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

来源:2-10 PHP类和对象之对象的高级特性

龍鈞

2017-08-12 19:29

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


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

写回答 关注

8回答

  • 慕设计151738
    2018-12-07 01:31:40

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

    $a = new Car();

    $b = new Car();

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

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

  • 慕设计151738
    2018-12-07 01:24:15

    $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}。

    希望有所帮助

    新手村上路

    。。。一脸懵圈,不明觉厉啊

    2019-01-07 03:02:41

    共 1 条回复 >

  • yuxinyijiu
    2018-08-27 19:20:05

    $a = new Car();

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

    $c = &$a;  //引用

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

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

  • 慕沐7363818
    2018-08-11 22:24:04

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

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

    当我们用

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

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

  • 月良
    2018-05-18 10:16:26

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

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

  • 慕数据4083019
    2017-11-13 08:21:52

    举个例子吧


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

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

    换成代码

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


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

    换成代码

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


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

    慕尼黑123... 回复慕数据408...

    那方法和函数到底是什么区别呢?

    2018-10-22 18:17:56

    共 2 条回复 >

  • qq_一个人的路上_0
    2017-08-22 09:14:09

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

    慕粉1720...

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

    2017-08-26 00:54:37

    共 1 条回复 >

  • 慕函数6219239
    2017-08-12 21:24:40

    $b=$a;

PHP进阶篇

轻松学习PHP中级课程,进行全面了解,用PHP快速开发网站程序

181836 学习 · 2577 问题

查看课程

相似问题