這似乎是一些編程語言中的特例。在php手冊中,我找不到含義。在帶賦值原因的條件語句中,false!==是什麼?
(false !== ($file = readdir($handle)))
有一個'右邊的任務,左邊的比較,但是整個操作符是什麼意思?
使用這個有什麼特別的注意事項嗎?
這似乎是一些編程語言中的特例。在php手冊中,我找不到含義。在帶賦值原因的條件語句中,false!==是什麼?
(false !== ($file = readdir($handle)))
有一個'右邊的任務,左邊的比較,但是整個操作符是什麼意思?
使用這個有什麼特別的注意事項嗎?
if (false !== ($file = readdir($handle)))
意味着
如果$ 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
}
的含義是:
「執行某些操作」不會被執行,因爲NULL被評估爲false。
如果$ file返回0 - 「執行某些操作」將不會被執行,因爲0被評估爲false。
如果$ file返回值false,則不執行「執行某些操作」。
以上僅用於描述!==運算符的工作原理。 readdir() - 函數不會返回所有這些值(null,0,false)。
這個問題就是這個問題。你能修正第一個列表中的拼寫嗎? – David 2013-04-24 21:34:36
@大衛,我盡力回答!感謝您注意拼寫。我現在修好了! :-) – bestprogrammerintheworld 2013-04-24 21:36:54
readdir()可以返回0,例如,如果它讀取的文件名是零 – 2013-04-24 21:40:33
這不是特別特殊的情況。
PHP嘗試執行readdir()函數並將結果分配給$ file變量。如果readdir()成功,那麼$ file將包含目錄值;但如果失敗,它將包含一個布爾值false。所以PHP執行readdir()並測試結果是否爲假或錯誤,因爲比較測試中的左值只是一種風格特徵。
你會經常看到
if (false == $x)
而不是
if ($x == false)
做比較時。 他們都做同樣的事情,不同的是
if (false = $x)
將拋出一個通知(如果啓用了錯誤日誌記錄)如果你輸入了錯誤的比較操作,而
if ($x = false)
不會顯示任何通知,並將分配的假給$ x這可能不是預期的值,可以在代碼
感謝馬克。意思是否一樣去除'false!=='?這不是一個雙重測試嗎? – David 2013-04-24 21:03:13
@David,在這種情況下它是冗餘的,爲了可讀性,應該真的被重寫爲兩行(正如其他人所說的)。 – 2013-04-24 21:07:32
分解後帶來問題和缺陷:
$file = readdir($handle);
if ($file !== false) {
}
從PHP手冊引用上readdir
:
這個函數可以返回布爾值FALSE,但也可能返回的值爲FALSE一個 非布爾值。請閱讀關於 布爾部分的更多信息。使用===運算符來測試此函數的返回值 。
這是以下簡寫:
$file = readdir($handle);
if (false !== $file) {
// etc
}
這將最常被發現作爲條件while循環。有兩點需要注意:
編輯針對OP的問題:
PHP既有 「寬鬆」 和 「嚴格」 的值檢查。鬆散的檢查使用==和!=運算符,並將「truthy」與「falsey」值進行比較。 False,0或空的stings或數組都是「falsey」,因此條件(「」== false)計算爲true,就像(0 == Array())一樣。
嚴格檢查使用===和!==。這意味着測試變量必須是相同,因此(0 === false)計算結果爲false,而(0 === 0)計算結果爲true。
有關readdir函數意味着什麼的解釋,manual page上有一個很大的紅色框來解釋它。
Great comment#2。你說這是因爲右側'可以'返回非布爾值,這進一步'測試'結果。 ?? '如果(#2)你會如何改進語法? – David 2013-04-24 21:07:08
對評論#2 +1! :-) – bestprogrammerintheworld 2013-04-24 21:30:44
@Matt,該代碼有意義的原因是在'while'子句中使用,而不是在'if'子句中使用時。即使php.net入口支持它。 – raidenace 2013-04-24 21:38:19
這基本上是一兩個語句:
$file = readdir($handle);
if($file !== false)
{
//do something
}
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。
你確定你不是這個意思!=?我並沒有真正使用PHP,但我從來沒有聽說過!==運算符。 – 2013-04-24 20:59:39
您需要閱讀[比較運算符](http://www.php.net/manual/en/language.operators.comparison.php) – 2013-04-24 21:01:04