課程
/后端開發(fā)
/PHP
/PHP進(jìn)階篇
我就想知道,在什么情況下,后面這段代碼是true?【if ($a === $b) echo '==='; 】
想不到什么情況他們是全等的。
2017-08-12
源自:PHP進(jìn)階篇 2-10
正在回答
上面的如果沒看懂,我就簡單說下我的理解
$a = new Car();
$b = new Car();
這兩段值一樣但是內(nèi)存地址不一樣,所以判斷不是全等
$a = $b = new Car(); 這一句 看起來跟上一句沒差別,但是程序執(zhí)行的時候是$a是先創(chuàng)建一個指針 指向NULL,然后看$b 有沒有指向 如果有就直接指向$b 的地址。所以他們的值和內(nèi)存都是一樣的。
$a = $b = new Car();
a.x = a = {n:2},我們可能會這么想:
1.先把?{n:2}?賦值給?a 2.然后再創(chuàng)建?a.x,將?{n:2}?再賦值給?a.x12
這樣似乎確實說不通 a.x 的值是 undefined,因為 a.x 確實是被賦值了的啊。 可事實上,a.x 的值就是 undefined。
a.x
undefined
再來看一下: a = a.x = {n:2},按照上面的思路來看的話,應(yīng)該是:
a = a.x = {n:2}
1.先把?{n:2}?賦值給?a.x,那么也就相當(dāng)于?b.x?=?{n:2}? 2.再把?a?重新指向?{n:2}。那么這時候?a.x?的值確實是?undefined,a?對象?{n:2}?中就沒有?x?屬性嘛。12
按照這種思路,上述兩種方式的結(jié)果應(yīng)該是不同的,但事實卻是a = a.x = {n:2}和a.x = a = {n:2}的結(jié)果是一致的,所以我們想的那種賦值的思路是不對的。
a.x = a = {n:2}
事實上,解析器在接受到 a = a.x = {n:2} 這樣的語句后,會這樣做:
找到 a 和 a.x 的指針。如果已有指針,那么不改變它。如果沒有指針,即那個變量還沒被申明,那么就創(chuàng)建它,指向 null。a 是有指針的,指向 {n:1};a.x 是沒有指針的,所以創(chuàng)建它,指向 null。然后把上面找到的指針,都指向最右側(cè)賦的那個值,即 {n:2}。
找到 a 和 a.x 的指針。如果已有指針,那么不改變它。如果沒有指針,即那個變量還沒被申明,那么就創(chuàng)建它,指向 null。
a 是有指針的,指向 {n:1};a.x 是沒有指針的,所以創(chuàng)建它,指向 null。
然后把上面找到的指針,都指向最右側(cè)賦的那個值,即 {n:2}。
希望有所幫助
新手村上路
$b = clone($a);? ?//克隆
$c = &$a;? //引用
使用clone的時候是克隆一個新實例,實例號不一樣(用var_dump可以查看),此時$a==$b;
引用時,$a === $c。
補充:定義一個變量,系統(tǒng)會給變量$variable分配一個內(nèi)存空間,假設(shè)$a = &$variable; $b = &$variable; 我們就說$a,$b是$variable的兩個引用。而引用不再分配內(nèi)存空間。
---------------完畢-----------------
當(dāng)我們用
if?($a?===?$b)?echo?'===';
這條語句的時候就會輸出true
if ($a->name === $b->name) echo '==='; //true
上面返回就是真,這個教程做的確實不好,很多地方說的很模糊。
舉個例子吧
人是一個類,這能理解吧。
但是同卵雙胞胎能說他們的基因(類中的屬性和方法)相同,但是并不能說他們完全相同對吧,起碼根據(jù)出生時間一個大一個小。
換成代碼
$a=new Car(),$b=new Car,分別用var_dump輸出,可以直觀的看出區(qū)別,這里就不發(fā)截圖了,而且動一下收印象更深嘛。
而我是一個精神分裂患者,我自己有n個我,這n個我不光基因相同,除了代號(實例名),什么都相同,因為我是同一個人。別鉆牛角尖說什么眼神不同啊。
本體$a=new Car(),另一重人格$b,但還是我,所以$b=$a,再有一重人格也同理,$c=$a,這時候這個if就成立了
這個在項目中怎么應(yīng)用呢?我也沒用過........就只是在前邊那個通過私有初始化函數(shù)來控制實例的創(chuàng)建的那一課用來檢查第二次創(chuàng)建的實例和第一次的是不是同一個實例(結(jié)果是true).....
慕數(shù)據(jù)4083019
慕尼黑123390 回復(fù) 慕數(shù)據(jù)4083019
全等不只是數(shù)值相等,數(shù)據(jù)類型也相等。比如數(shù)值123和字符串“123”
慕粉1720382552
$b=$a;
舉報
輕松學(xué)習(xí)PHP中級課程,進(jìn)行全面了解,用PHP快速開發(fā)網(wǎng)站程序
3 回答問一下下面的代碼是運用在什么情況下?我的理解對不對?
2 回答?我就想知道為什么是$0,我用$1,都不行
3 回答我想知道這個 $args 代碼是從哪里冒出來的 有什么意思嗎?
2 回答我想知道 m s x 是什么作用
1 回答以前學(xué)c++就不知道這兩東西有什么用,現(xiàn)在還是不知道
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2018-12-07
上面的如果沒看懂,我就簡單說下我的理解
$a = new Car();
$b = new Car();
這兩段值一樣但是內(nèi)存地址不一樣,所以判斷不是全等
$a = $b = new Car(); 這一句 看起來跟上一句沒差別,但是程序執(zhí)行的時候是$a是先創(chuàng)建一個指針 指向NULL,然后看$b 有沒有指向 如果有就直接指向$b 的地址。所以他們的值和內(nèi)存都是一樣的。
2018-12-07
$a = new Car();
$b = new Car();
$a = $b = new Car();
a.x = a = {n:2},我們可能會這么想:
這樣似乎確實說不通
a.x
的值是undefined
,因為a.x
確實是被賦值了的啊。可事實上,
a.x
的值就是undefined
。再來看一下:
a = a.x = {n:2}
,按照上面的思路來看的話,應(yīng)該是:按照這種思路,上述兩種方式的結(jié)果應(yīng)該是不同的,但事實卻是
a = a.x = {n:2}
和a.x = a = {n:2}
的結(jié)果是一致的,所以我們想的那種賦值的思路是不對的。事實上,解析器在接受到 a = a.x = {n:2} 這樣的語句后,會這樣做:
希望有所幫助
2018-08-27
$a = new Car();
$b = clone($a);? ?//克隆
$c = &$a;? //引用
使用clone的時候是克隆一個新實例,實例號不一樣(用var_dump可以查看),此時$a==$b;
引用時,$a === $c。
2018-08-11
補充:定義一個變量,系統(tǒng)會給變量$variable分配一個內(nèi)存空間,假設(shè)$a = &$variable; $b = &$variable; 我們就說$a,$b是$variable的兩個引用。而引用不再分配內(nèi)存空間。
---------------完畢-----------------
當(dāng)我們用
這條語句的時候就會輸出true
2018-05-18
if ($a->name === $b->name) echo '==='; //true
上面返回就是真,這個教程做的確實不好,很多地方說的很模糊。
2017-11-13
舉個例子吧
人是一個類,這能理解吧。
但是同卵雙胞胎能說他們的基因(類中的屬性和方法)相同,但是并不能說他們完全相同對吧,起碼根據(jù)出生時間一個大一個小。
換成代碼
$a=new Car(),$b=new Car,分別用var_dump輸出,可以直觀的看出區(qū)別,這里就不發(fā)截圖了,而且動一下收印象更深嘛。
而我是一個精神分裂患者,我自己有n個我,這n個我不光基因相同,除了代號(實例名),什么都相同,因為我是同一個人。別鉆牛角尖說什么眼神不同啊。
換成代碼
本體$a=new Car(),另一重人格$b,但還是我,所以$b=$a,再有一重人格也同理,$c=$a,這時候這個if就成立了
這個在項目中怎么應(yīng)用呢?我也沒用過........就只是在前邊那個通過私有初始化函數(shù)來控制實例的創(chuàng)建的那一課用來檢查第二次創(chuàng)建的實例和第一次的是不是同一個實例(結(jié)果是true).....
2017-08-22
全等不只是數(shù)值相等,數(shù)據(jù)類型也相等。比如數(shù)值123和字符串“123”
2017-08-12
$b=$a;