这在某些编程语言中似乎是一种特殊情况。在php手册中,我找不到它的含义。
(false !== ($file = readdir($handle)))
右边是赋值,左边是比较,但整个运算符是什么意思?
使用这个有什么特殊考虑吗?
这是以下内容的简写:
$file = readdir($handle);
if (false !== $file) {
// etc
}
这通常被认为是while循环的条件。有两件事需要注意:
- 他们使用严格的检查(!==而不是!=(,因为readdir可以返回"false",比如空字符串
- 这是一个非常不透明的语法,我会射杀任何一个给我带来这个语法的大三学生
编辑回答OP的问题:
PHP同时具有"宽松"answers"严格"的值检查。松散检查使用==和!=运算符,并将"truthy"值与"false"值进行比较。False、0或空的字符串或数组都是"False",因此条件("==False(的计算结果为true,(0==Array(((也是如此。
严格检查使用===和!===。这意味着测试的变量必须相同,因此(0===false(计算为false,而(0===0(计算为true。
为了解释这对readdir函数意味着什么,手册页面上有一个红色的大框来解释它。
这不是特别的情况。
PHP尝试执行readdir((函数,并将结果分配给$file变量。如果readdir((成功,那么$file将包含目录值;但如果失败,它将包含布尔值false。因此,PHP执行readdir((并测试结果是否为false。。。在比较测试中,假作为左值只是一种文体特征。
你经常会看到
if (false == $x)
而不是
if ($x == false)
进行比较时。除了
if (false = $x)
如果您键入错误的比较运算符,将抛出一个通知(如果启用了错误日志记录(,而
if ($x = false)
不会显示任何通知,并且会将值false分配给$x,这可能不是有意的,并且可能会在代码中引入问题和bug
分解:
$file = readdir($handle);
if ($file !== false) {
}
引用PHP readdir
:手册
此函数可能返回布尔值FALSE,但也可能返回计算结果为FALSE的非布尔值。请阅读布尔值可获取更多信息。使用===运算符测试此函数的返回值。
这基本上是两个语句合一:
$file = readdir($handle);
if($file !== false)
{
//do something
}
readdir()
给出FALSE或当前目录中正在读取的下一个项目的名称。
假设目录是可读的,$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。
if (false !== ($file = readdir($handle)))
意味着
- $file被赋值为readdir($handle(
- 然后检查该值是否为精确">NOTfalse">
如果$file=readdir($handle(返回值NULL,则代码为:
if (false !== ($file = readdir($handle))) {
//do something
}
"Do something"将被执行,因为NULL不是false。
如果$file返回0-将执行"Do something",因为0不是false。
如果$file返回值false,则不会执行"Do something"。
如果你有这个代码:(少一个=操作员(
if (false != ($file = readdir($handle))) {
//do something
}
意思是:
- $file被赋值为readdir($handle(
- 然后检查该值的评估是否为">NOTfalse">
"Do something"将不会执行,因为NULL的计算结果为false。
如果$file返回0,则不会执行"Do something",因为0的计算结果为false。
如果$file返回值false,则不会执行"Do something"。
以上只是为了描述如何!==操作员工作。readdir((-函数不会返回所有这些值(null、0、false(。