在某些编程语言中,这似乎是一种特殊情况。在php手册中,我找不到含义。
(false !== ($file = readdir($handle)))
右边有'赋值,左边有比较,但整个运算符是什么意思?
使用这个有什么特别的考虑吗?
在某些编程语言中,这似乎是一种特殊情况。在php手册中,我找不到含义。
(false !== ($file = readdir($handle)))
右边有'赋值,左边有比较,但整个运算符是什么意思?
使用这个有什么特别的考虑吗?
这是以下内容的简写:
$file = readdir($handle);
if (false !== $file) {
// etc
}
这最常见于 while 循环的条件。有两点需要注意:
编辑回应OP的问题:
PHP 具有“松散”和“严格”的值检查。松散检查使用 == 和 != 运算符,它比较“真”与“假”值。假、0 或空字符串或数组都是“假的”,因此条件 ("" == false) 的计算结果为真, (0 == Array()) 也是如此。
严格检查使用 === 和 !==。这意味着测试变量必须相同,因此 (0 === false) 评估为 false,而 (0 === 0) 评估为 true。
为了解释这对 readdir 函数意味着什么,手册页上有一个红色的大框来解释它。
分解:
$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。
这不是一个特别的情况。
PHP 尝试执行 readdir() 函数并将结果分配给 $file 变量。如果 readdir() 成功,则 $file 将包含目录值;但如果失败,它将包含一个布尔值 false。所以 PHP 执行 readdir() 并测试结果是否为假......比较测试中的左值假只是一个风格特征。
经常你会看到
if (false == $x)
而不是
if ($x == false)
做比较的时候。他们都做同样的事情,除了
if (false = $x)
如果您错误输入了比较运算符,将抛出一个通知(如果启用了错误日志记录),而
if ($x = false)
不会显示任何通知,并将为 $x 分配一个 false 值,这可能不是预期的,并且可能会在代码中引入问题和错误
if (false !== ($file = readdir($handle)))
意思是
如果 $file = readdir($handle) 返回值 NULL,并且您有以下代码:
if (false !== ($file = readdir($handle))) {
//do something
}
“做某事”将被执行,因为 NULL 不是假的。
如果 $file 返回 0 - “做某事”将被执行,因为 0 不是假的。
如果 $file 返回值 false,则不会执行“做某事”。
如果您有此代码:(少一个 = 运算符)
if (false != ($file = readdir($handle))) {
//do something
}
意思是:
“做某事”不会被执行,因为 NULL 被评估为假。
如果 $file 返回 0 - “做某事”将不会被执行,因为 0 被评估为假。
如果 $file 返回值 false,则不会执行“做某事”。
以上只是为了描述 !== 运算符的工作原理。readdir() 函数不会返回所有这些值(null、0、false)。