2012-10-13 64 views
3

我在PHP中遇到一個奇怪的和意外的行爲,同時比較了一些字符串值。當我期望它們返回false時,下面的前兩個語句返回true。最後一條語句按預期返回錯誤。我知道PHP的Type Juggling,但我從文檔中瞭解到,當你比較像字符串和整數這樣的兩種不同數據類型時,會發生類型雜耍。在下面的例子中,雖然這兩個文字都是字符串。這是否意味着,當你在PHP中進行字符串比較時,它會檢查這兩個字符串,看看它們是否看起來像整數,如果是,則將這兩個字符串轉換爲整數,然後比較這些整數值。所以我的問題是在這種行爲發生的條件下,字符串比較在PHP中的工作原理是什麼?php字符串比較意外類型雜耍

var_dump("10" == "10.0000"); 
var_dump("10" == "+10."); 
var_dump("10" == "10 "); 

#output 
bool(true) 
bool(true) 
bool(false) 

更新

所以下面comparison involves numerical strings巴巴的答案真的幫助了讓我明白髮生了什麼事情。函數is_numeric將返回給您,不管字符串是否被認爲是數字字符串。有趣的是不被視爲數字字符串,但" 10"是。我挖掘了PHP源代碼,我相信implementation of is_numeric位於is_numeric_string_ex函數中。從那個人可以確切地知道什麼時候PHP將字符串視爲數字字符串。

+1

您可以使用'==='或更明確的'strcmp' /'strcasecmp'來代替接受類型玩雜耍。 – DCoder

+0

我知道這些選項。我不在尋找替代品我希望瞭解==運算符,以及它究竟何時和爲什麼適用於類型雜耍 –

+2

不要使用'=='運算符。像許多PHP功能一樣,它包含了太多的魔力。您可以嘗試瞭解所有類型雜耍的例外情況,但最好避免這種情況。 – GolezTrol

回答

2

你得到,因爲空間的位置的誤差,這將返回true

var_dump("10" == " 10"); // true 

所以,如果你運行

var_dump("10" == "10 "); //false 

您實際運行是因爲它會作爲一個被處理字符串

var_dump("10" == 0); //false 

這是因爲類型雜耍會轉換"10 "0這是在PHP Documentation

FROM PHP DOC

TRUE,如果$ a等於$ b型雜耍之後。

如果您將數字與字符串進行比較或者比較涉及數字字符串,則將每個字符串轉換爲數字,並以數字形式進行比較。這些規則也適用於switch語句。當比較結果爲===或!==時,類型轉換不會發生,因爲這涉及比較類型和值。

如果你想欺騙式雜耍

var_dump("10" == 0 + "10 "); // true 

This is Because

PHP的自動類型轉換的一個例子是加號 '+'。如果任一操作數是一個浮點數,那麼這兩個操作數都被評估爲浮點數,結果將是一個浮點數。否則,操作數將被解釋爲整數,結果也將是一個整數。請注意,這不會改變操作數本身的類型;唯一的變化就是如何評估操作數以及表達式本身的類型。

+0

你可以把這個語句出現在PHP文檔的鏈接嗎?謝謝 –

+0

@Marwan Alsabbagh完成... – Baba

+0

我不認爲「10」會變成0,如果你這樣做(int)(「10」)它會給你int(10) –

0

在這種情況下,除最後一個之外的所有「字符串」都被視爲浮動或整數,然後進行比較。這就是爲什麼第1行和第2行是真實的。

在第3行中有一個字符串中的空格,這意味着對於PHP來說,這是一個'真正'的字符串,並且該行比較了字符串。

我不喜歡loose typed語言,但對於PHP來說,這是它的工作方式。

+1

我明白這一點。我在帖子中描述了相同的過程,但是我想知道的是這種行爲在任何地方都有記錄。或者有人可以發佈實際做出這些決定的PHP內部代碼片段。 –

1

我猜想肯定的答案介於埋在 compare_function 在PHP-SRC /的Zend/zend_operators.c浩瀚,並在那裏使用的宏。