-1

在某些编程语言中,这似乎是一种特殊情况。在php手册中,我找不到含义。

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

右边有'赋值,左边有比较,但整个运算符是什么意思?

使用这个有什么特别的考虑吗?

4

6 回答 6

2

这是以下内容的简写:

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

这最常见于 while 循环的条件。有两点需要注意:

  1. 他们正在使用严格检查(!== 而不是!=),因为 readdir 可以返回“错误”的东西,比如空字符串。
  2. 这是非常不透明的语法,我会射杀任何把它带给我的后辈。

编辑回应OP的问题:

PHP 具有“松散”和“严格”的值检查。松散检查使用 == 和 != 运算符,它比较“真”与“假”值。假、0 或空字符串或数组都是“假的”,因此条件 ("" == false) 的计算结果为真, (0 == Array()) 也是如此。

严格检查使用 === 和 !==。这意味着测试变量必须相同,因此 (0 === false) 评估为 false,而 (0 === 0) 评估为 true。

为了解释这对 readdir 函数意味着什么,手册页上有一个红色的大框来解释它。

于 2013-04-24T21:04:05.553 回答
1

分解:

$file = readdir($handle);

if ($file !== false) {

}

引用 PHP 手册readdir

此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符测试此函数的返回值。

于 2013-04-24T21:03:45.517 回答
1

这基本上是两个语句合二为一:

$file = readdir($handle);
if($file !== false) 
{
  //do something
}
于 2013-04-24T21:06:53.390 回答
1

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。

于 2013-04-24T21:15:41.287 回答
1

这不是一个特别的情况。

PHP 尝试执行 readdir() 函数并将结果分配给 $file 变量。如果 readdir() 成功,则 $file 将包含目录值;但如果失败,它将包含一个布尔值 false。所以 PHP 执行 readdir() 并测试结果是否为假......比较测试中的左值假只是一个风格特征。

经常你会看到

if (false == $x)

而不是

if ($x == false)

做比较的时候。他们都做同样的事情,除了

if (false = $x)

如果您错误输入了比较运算符,将抛出一个通知(如果启用了错误日志记录),而

if ($x = false)

不会显示任何通知,并将为 $x 分配一个 false 值,这可能不是预期的,并且可能会在代码中引入问题和错误

于 2013-04-24T21:01:56.390 回答
0
if (false !== ($file = readdir($handle)))

意思是

  • $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
}

意思是:

  • $file 被赋值为 readdir($handle)
  • 然后检查该值的评估是否为“ NOT false”

“做某事”不会被执行,因为 NULL 被评估为假。

如果 $file 返回 0 - “做某事”将不会被执行,因为 0 被评估为假。

如果 $file 返回值 false,则不会执行“做某事”。

以上只是为了描述 !== 运算符的工作原理。readdir() 函数不会返回所有这些值(null、0、false)。

于 2013-04-24T21:26:44.650 回答