2013-04-24 35 views
-1

這似乎是一些編程語言中的特例。在php手冊中,我找不到含義。在帶賦值原因的條件語句中,false!==是什麼?

(false !== ($file = readdir($handle))) 

有一個'右邊的任務,左邊的比較,但是整個操作符是什麼意思?

使用這個有什麼特別的注意事項嗎?

+0

你確定你不是這個意思!=?我並沒有真正使用PHP,但我從來沒有聽說過!==運算符。 – 2013-04-24 20:59:39

+2

您需要閱讀[比較運算符](http://www.php.net/manual/en/language.operators.comparison.php) – 2013-04-24 21:01:04

回答

0
if (false !== ($file = readdir($handle))) 

意味着

  • $文件分配與價值的readdir($處理)
  • ,然後檢查是否值不EXACTLY假」

如果$ file = readdir($ handle)返回值NULL,並且您有以下代碼:

if (false !== ($file = readdir($handle))) { 
//do something 
} 

「執行某些操作」會被執行,因爲NULL不是錯誤的。

如果$ file返回0 - 「執行某些操作」將被執行,因爲0不是false。

如果$ file返回值false,則不執行「執行某些操作」。

如果不是有這樣的代碼:(少=運算符)

if (false != ($file = readdir($handle))) { 
//do something 
} 

的含義是:

  • $文件與價值的readdir($處理)
  • ,然後分配檢查該值是否爲「NOT false」

「執行某些操作」不會被執行,因爲NULL被評估爲false。

如果$ file返回0 - 「執行某些操作」將不會被執行,因爲0被評估爲false。

如果$ file返回值false,則不執行「執行某些操作」。

以上僅用於描述!==運算符的工作原理。 readdir() - 函數不會返回所有這些值(null,0,false)。

+0

這個問題就是這個問題。你能修正第一個列表中的拼寫嗎? – David 2013-04-24 21:34:36

+0

@大衛,我盡力回答!感謝您注意拼寫。我現在修好了! :-) – bestprogrammerintheworld 2013-04-24 21:36:54

+2

readdir()可以返回0,例如,如果它讀取的文件名是零 – 2013-04-24 21:40:33

1

這不是特別特殊的情況。

PHP嘗試執行readdir()函數並將結果分配給$ file變量。如果readdir()成功,那麼$ file將包含目錄值;但如果失敗,它將包含一個布爾值false。所以PHP執行readdir()並測試結果是否爲假或錯誤,因爲比較測試中的左值只是一種風格特徵。

你會經常看到

if (false == $x) 

而不是

if ($x == false) 

做比較時。 他們都做同樣的事情,不同的是

if (false = $x) 

將拋出一個通知(如果啓用了錯誤日誌記錄)如果你輸入了錯誤的比較操作,而

if ($x = false) 

不會顯示任何通知,並將分配的假給$ x這可能不是預期的值,可以在代碼

+0

感謝馬克。意思是否一樣去除'false!=='?這不是一個雙重測試嗎? – David 2013-04-24 21:03:13

+1

@David,在這種情況下它是冗餘的,爲了可讀性,應該真的被重寫爲兩行(正如其他人所說的)。 – 2013-04-24 21:07:32

1

分解後帶來問題和缺陷:

$file = readdir($handle); 

if ($file !== false) { 

} 

從PHP手冊引用上readdir

這個函數可以返回布爾值FALSE,但也可能返回的值爲FALSE一個 非布爾值。請閱讀關於 布爾部分的更多信息。使用===運算符來測試此函數的返回值 。

2

這是以下簡寫:

$file = readdir($handle); 
if (false !== $file) { 
// etc 
} 

這將最常被發現作爲條件while循環。有兩點需要注意:

  1. 它們使用嚴格檢查(!==而不是!=),因爲readdir可以返回「falsey」的東西,比如空字符串。
  2. 這是令人難以置信的不透明的語法,我會拍攝任何帶我到這裏的小輩。

編輯針對OP的問題:

PHP既有 「寬鬆」 和 「嚴格」 的值檢查。鬆散的檢查使用==和!=運算符,並將「truthy」與「falsey」值進行比較。 False,0或空的stings或數組都是「falsey」,因此條件(「」== false)計算爲true,就像(0 == Array())一樣。

嚴格檢查使用===和!==。這意味着測試變量必須是相同,因此(0 === false)計算結果爲false,而(0 === 0)計算結果爲true。

有關readdir函數意味着什麼的解釋,manual page上有一個很大的紅色框來解釋它。

+0

Great comment#2。你說這是因爲右側'可以'返回非布爾值,這進一步'測試'結果。 ?? '如果(#2)你會如何改進語法? – David 2013-04-24 21:07:08

+0

對評論#2 +1! :-) – bestprogrammerintheworld 2013-04-24 21:30:44

+1

@Matt,該代碼有意義的原因是在'while'子句中使用,而不是在'if'子句中使用時。即使php.net入口支持它。 – raidenace 2013-04-24 21:38:19

1

這基本上是一兩個語句:

$file = readdir($handle); 
if($file !== false) 
{ 
    //do something 
} 
1

readdir()給出任何假OR在當前目錄是讀取下一個項目的名稱。

假設目錄是可讀的,$ file將具有下一個文件或目錄的名稱。

所以(false !== ($file = readdir($handle)))變爲:

(false !== <name_of_a_file_or_dir>) //dir was read and the name passed to $file 

在這種情況下,比較將解析爲TRUE。

假設目錄不可讀,$ file將變爲FALSE。 所以(false !== ($file = readdir($handle)))變爲:

(false !== false) //because dir was not readable 

在這種情況下,比較將解析爲FALSE。

相關問題