2013-04-24 42 views
-1

这似乎是一些编程语言中的特例。在php手册中,我找不到含义。在带赋值原因的条件语句中,false!==是什么?

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

有一个'右边的任务,左边的比较,但是整个操作符是什么意思?

使用这个有什么特别的注意事项吗?

+0

你确定你不是这个意思!=?我并没有真正使用PHP,但我从来没有听说过!==运算符。 – 2013-04-24 20:59:39

+2

您需要阅读[比较运算符](http://www.php.net/manual/en/language.operators.comparison.php) – 2013-04-24 21:01:04

回答

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

意味着

  • $文件分配与价值的readdir($处理)
  • ,然后检查是否值不EXACTLY假”

如果$ 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 
} 

的含义是:

  • $文件与价值的readdir($处理)
  • ,然后分配检查该值是否为“NOT false”

“执行某些操作”不会被执行,因为NULL被评估为false。

如果$ file返回0 - “执行某些操作”将不会被执行,因为0被评估为false。

如果$ file返回值false,则不执行“执行某些操作”。

以上仅用于描述!==运算符的工作原理。 readdir() - 函数不会返回所有这些值(null,0,false)。

+0

这个问题就是这个问题。你能修正第一个列表中的拼写吗? – David 2013-04-24 21:34:36

+0

@大卫,我尽力回答!感谢您注意拼写。我现在修好了! :-) – bestprogrammerintheworld 2013-04-24 21:36:54

+2

readdir()可以返回0,例如,如果它读取的文件名是零 – 2013-04-24 21:40:33

1

这不是特别特殊的情况。

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

你会经常看到

if (false == $x) 

而不是

if ($x == false) 

做比较时。 他们都做同样的事情,不同的是

if (false = $x) 

将抛出一个通知(如果启用了错误日志记录)如果你输入了错误的比较操作,而

if ($x = false) 

不会显示任何通知,并将分配的假给$ x这可能不是预期的值,可以在代码

+0

感谢马克。意思是否一样去除'false!=='?这不是一个双重测试吗? – David 2013-04-24 21:03:13

+1

@David,在这种情况下它是冗余的,为了可读性,应该真的被重写为两行(正如其他人所说的)。 – 2013-04-24 21:07:32

1

分解后带来问题和缺陷:

$file = readdir($handle); 

if ($file !== false) { 

} 

从PHP手册引用上readdir

这个函数可以返回布尔值FALSE,但也可能返回的值为FALSE一个 非布尔值。请阅读关于 布尔部分的更多信息。使用===运算符来测试此函数的返回值 。

2

这是以下简写:

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

这将最常被发现作为条件while循环。有两点需要注意:

  1. 它们使用严格检查(!==而不是!=),因为readdir可以返回“falsey”的东西,比如空字符串。
  2. 这是令人难以置信的不透明的语法,我会拍摄任何带我到这里的小辈。

编辑针对OP的问题:

PHP既有 “宽松” 和 “严格” 的值检查。松散的检查使用==和!=运算符,并将“truthy”与“falsey”值进行比较。 False,0或空的stings或数组都是“falsey”,因此条件(“”== false)计算为true,就像(0 == Array())一样。

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

有关readdir函数意味着什么的解释,manual page上有一个很大的红色框来解释它。

+0

Great comment#2。你说这是因为右侧'可以'返回非布尔值,这进一步'测试'结果。 ?? '如果(#2)你会如何改进语法? – David 2013-04-24 21:07:08

+0

对评论#2 +1! :-) – bestprogrammerintheworld 2013-04-24 21:30:44

+1

@Matt,该代码有意义的原因是在'while'子句中使用,而不是在'if'子句中使用时。即使php.net入口支持它。 – raidenace 2013-04-24 21:38:19

1

这基本上是一两个语句:

$file = readdir($handle); 
if($file !== false) 
{ 
    //do something 
} 
1

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。

相关问题