什么是假的在带有赋值原因的条件语句中


What does false !== in a conditional statement with assignment cause?

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

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

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

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

这是以下内容的简写:

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

这通常被认为是while循环的条件。有两件事需要注意:

  1. 他们使用严格的检查(!==而不是!=(,因为readdir可以返回"false",比如空字符串
  2. 这是一个非常不透明的语法,我会射杀任何一个给我带来这个语法的大三学生

编辑回答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(。