2013-01-23 52 views
2

這是絕對的瘋狂。我今天正在測試一個帖子變量,應該總是評估一個字符。示例代碼是...PHP認爲P == 0

if($_POST['status'] == '' || $_POST['status'] == 0){ die('oh no!'); } 

如果我通過P的狀態,這是執行模具聲明。然後,我創建了下面的代碼的PHP文件...

echo 'P1: '.intval($_POST['status']=='').'<br />'; 
echo 'P2: '.intval($_POST['status']==0).'<br />'; 
echo 'P3: '.intval('P'==0).'<br />'; 

你猜怎麼着? P2 & P3都評估爲TRUE。 intval只是在P1上顯示0而不是任何內容。

這是PHP的一個已知的錯誤?這只是在我正在運行的版本上被破壞的東西?坦率地說,我完全喪失了爲什麼這樣做。它使用triple equals正確評估,但不是double。 P絕對不會在我的書不等於0 ...

+2

'在我的書中'P肯定不等於0'改變這本書,對於PHP而言。它是已知的功能,而不是bug。 –

+0

認真嗎?記錄在哪裏?你有源代碼鏈接嗎? [PHP == VS ===操作]的 – GameCharmer

+0

可能重複(http://stackoverflow.com/questions/589549/php-vs-operator) – dm03514

回答

10

PHP documentation

如果你比較了一些用細繩或比較涉及數字字符串,然後每個字符串轉換成一個數字,數值進行比較。

+0

等待8分鐘,我會接受它。男人,這看起來不正確,看起來是這樣。 – GameCharmer

+2

@GameCharmer:這是在那些類型,許可大多數其他語言一樣。 PHP將試圖盡力解釋你想要什麼,但如果你堅持做「長頸鹿==等離子電視」,那麼它只是GIGO ... –

+1

@GameCharmer這是方便,如果你嘗試比較'3 ==「3」 '例如,我們經常使用PHP進行操作。 ''P'== 0'是違反直覺的,但遵循了非常相同的邏輯。 – Tchoupi

1

閱讀比較的PHP手冊。 http://php.net/manual/en/language.operators.comparison.php

如果你比較多個具有一個字符串或比較涉及 數字串,則每一個字符串被轉換爲數字和數值進行 比較。

如果您不希望發生轉換,則需要使用triple equals。

$a === $b

TRUE,如果$ a等於$ b,並且它們是同一類型

$a == $b

TRUE,如果$ a等於$ b,它們是同一類型的。

1

使用==比較字符串和數字時,PHP會將該字符串轉換爲數字。

字符串'P'在其中沒有任何數字字符。因此,PHP 將其評估爲編號0。最後發生0 == 0,這是true。另一方面,如果您使用三重等於(===),則提到的轉換 不會發生。 PHP期望它們的類型也匹配。因爲其中一個是 字符串,其他是數字,它返回false