2015-06-23 141 views
7

在PHP中試圖熟悉if語句時,發生了這種情況。 我第一次嘗試下面的代碼。if語句在php中不起作用

if(true) {echo 'true';} else {echo 'false';} 

和輸出是true當條件是true。再次,當條件是falseif(false))時,其回聲false

但我試過同樣的,使用變量作爲條件,同時改變變量的值。

$con='false'; 
if($con){echo 'true';} else{echo 'false';} 

在這種情況下,輸出是true即使當變量值爲falsetrue。與此同時,使用10代替truefalse時,if statement工作正常。這是爲什麼發生?

+4

'假'=假 – Prasanth

+2

所以..很多..答案值:O! – Luke

回答

6

PHP在if表達式中做了一些鬼鬼祟祟的事情。下面的值被認爲是FALSE:

  • 布爾值FALSE
  • 整數0(零)
  • 浮子0.0(零)
  • 空字符串,字符串 「0」
  • 具有零個元素的數組
  • 零個成員變量(PHP 4只)
  • 特殊類型NULL(包括尚未設定的變量)
  • 的對象
  • 從空標記創建的SimpleXML對象

每個其他值都被視爲TRUE(包括任何資源)。

實際上,你傳遞的是一個字串,表示單詞false,而不是false本身。因爲這不在上面的列表中,所以它被認爲是真的!

+3

那裏有什麼鬼鬼祟祟的? –

+0

我是強打字的粉絲:) – Luke

+0

謝謝。很好地解釋! – DScript

9
$con='false'; 

'false'是不是布爾FALSE,就像$con='hi';是不是一個有效的字符串。

$con=FALSE; //this is false now 

要從Manual

報價要指定一個布爾值,使用常量TRUE或FALSE。兩者都不區分大小寫。

此外讀取您有

當轉換爲布爾值,下面的值被認爲是FALSE這些選項:

◦布爾值FALSE
◦整數0(零)
■浮點數0.0(零)
■空字符串和字符串「0」
■具有零元素的數組
◦零個成員變量(PHP 4只)
◦特殊類型NULL(包括尚未設定的變量)從空標籤

創建
◦SimpleXML的對象的對象然後就觀察到了這種

同時,當使用1和0代替true和false時,if語句正常工作。這是爲什麼發生?

這是因爲任何形式的0都是FALSE,無論是字符串還是數字。但文字false作爲一個字符串是不是因爲上述原因而錯誤。

也瞭解PHP Strict Comparisons,因爲你在學習,因爲

var_dump(0==FALSE); //bool(true) 
var_dump(0===FALSE); //bool(false) :) 
2

你可以這樣

$con=false; 
2

'false'賦給變量值不一樣false

if('true')if('false')將導致true總是因爲它們將被視爲string S和將被轉換以進行比較。

$con=false; 
if($con){echo 'true';} else{echo 'false';} 

將打印false

2

在你的第二個例子,$con不是布爾false,這是一個字符串字面'false'(注意引號),而在PHP任何非空字符串作爲計算true

爲了解決這個問題,只是下降的行情:

$con=false; // no quotes! 
if($con){echo 'true';} else{echo 'false';} 
3

使用,而不是一個串一個布爾值:

$con = false; 

你的if語句會簡單地檢查$ con是不是空的,所以在你的例子永遠是真的。

+0

「由於PHP 5.3」?在最近的歷史中,布爾比較沒有任何改變。 – deceze

+0

@deceze我認爲PHP檢查一個字符串是否是這樣的字符串是在PHP 5.3中引入的,我會把它帶出來消除任何混淆。 –

3

如關於表達式的部分所述,表達式評估爲其布爾值。如果表達式的計算結果爲TRUE,PHP將執行語句,並且如果計算結果爲FALSE - 它將忽略它。在'Converting to boolean'部分中可找到有關什麼值評估爲FALSE的更多信息。

所以按照文檔嘗試使用

$con = false;//boolean and not a string 
if($con){echo 'true';} else{echo 'false';} 

當轉換爲布爾值,下面的值被認爲是FALSE:

◦布爾值FALSE
◦整數0(零)◦浮點數0.0(零)
◦空字符串和字符串「0」
◦用零個元素
◦零個成員變量(PHP 4只)
◦特殊類型NULL(包括尚未設定的變量)
◦從空標籤

Check Docs (IF MANUAL)創建的SimpleXML對象的對象的陣列

2

您的$ con聲明是一個字符串而不是bool。所以它將永遠回報真實。 要聲明一個布爾值,使用:

$con=FALSE; //or TRUE 
3

您正在使用「假」爲STRING變量,但畢竟是WORD假的,不是布爾不變。只需使用

if(true) {echo 'true';} else {echo 'false';} 

$con='false'; // Wrong 
$con=false; // Right 
if($con){echo 'true';} else{echo 'false';} 

當你正在做的if語句,這將工作:

if ($con == false) { echo 'false'; } 

,或者您可以使用它通過價值和類型有一個比較表達式到另一個=== 。

if ($con === false) { echo 'false with type safe comparison!'; } 
1

變化的變量來此

$con = false;