这似乎是一些编程语言中的特例。在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