2012-11-13 19 views
2

我在我的代碼如下:PHP - 意外的使用行爲==(等於)和===(相同)

$mixed = array(); 
$mixed[0] = "It's a zero!"; 
$mixed['word'] = "It's a word!"; 

foreach ($mixed as $key => $value) { 
    if ($key == 'word') {    
    echo $value.'<br />'; 
    } 
} 

上面會因某種原因同時打印「!這是一個零」和「這是一個字!」。我期待它只打印「這是一個字!」。這是爲什麼??我覺得我錯過了一些重要的東西。當我在if語句中使用===時,它按預期工作,換句話說,它只打印「這是一個詞!」。我知道平等和相同的操作員之間有區別,但第一個例子並不相同嗎?

+1

如果你真的看過這個問題,這並不重複。被接受的答案使這一點非常清楚。 – Nicole

回答

5

==在比較之前爲您進行類型轉換。

當你與一個整數0做了一個==,它轉換成'word'適當整數值

intval()返回當供給的純字符串0,所以0匹配。另一個匹配字符串上下文,並匹配。


===確實沒有這樣的隱式轉換,所以它只有在一種情況下返回true,則琴絃實際上是相同的。

1

PHP變量有類型。

==轉換爲相同類型後檢查相等性,===也檢查類型。使用var_dump來查看真實類型。

0

$ a == $ b如果在類型雜耍後$ a等於$ b,則等於TRUE。 $ a === $ b如果$ a等於$ b,則它們是相同的,並且它們是相同的類型。

它看起來是

如果你檢查0反對用==字符串,然後PHP返回true:

PHP -R '的var_dump(0 == 「狀態」);' - >返回TRUE

但如果你的字符串有一些開頭:

PHP -R '的var_dump(0 == 「2statuses」);' - >返回FALSE

從規格我得到它它嘗試轉換 - 在這種情況下,字符串到數字。以上這

因此更好地利用===

http://php.net/manual/en/language.operators.comparison.php

1

「看看@Cthulhu答案是非常清楚的。

除此之外,這裏是一個不同的例子。 strpos()函數從haystack返回needle的位置。

<?php 
$pos_a = strpos('apple', 'a'); // a is in the first position. 
$pos_b = strpos('apple', 'b'); // there is no b. 
if ($pos_a){ 
    echo 'we got a!'."\n"; 
} 
if ($pos_b){ 
    echo 'we got b!'."\n"; 
} 

strpos回報FALSE如果針沒有找到。但是你會看到php不會運行任何echo語句。

如果var_dumo()倒是這兩個值,你會看到$pos_a$pos_b包含0FALSE

if聲明只是失敗,因爲0FALSE都被認爲是FALSE除非你使用===

現在試試這個:

<?php 
$pos_a = strpos('apple', 'a'); // a is in the first position. 
$pos_b = strpos('apple', 'b'); // there is no b. 
if ($pos_a !== FALSE){ 
    echo 'we got a!'."\n"; 
} 
if ($pos_b !== FALSE){ 
    echo 'we got b!'."\n"; 
} 

現在你會看到預期的結果,因爲它回聲「我們得到了一個!」。

+0

+1酷炫的例子! –