我正在尝试理解以下PHP脚本
<?php
if ($handle = opendir('files'.'/')) {
while ($file = readdir($handle)) {
echo $file.'<br>';
}
}
?>
我不完全理解这是如何工作的,因为$handle
变量似乎要么不被声明,要么被声明在if
条件内。但如果它在if
条件内声明,那么测试的条件是什么?同样对于while
循环,它测试的是什么?我直观地知道它是以某种方式测试目录列表的结尾,但确切地说,if
条件失败或while
条件失败会发生什么?在这里使用if
类似于错误处理方法吗?我查找了PHP中的错误处理,但没有找到。
答案 0 :(得分:3)
在PHP中,赋值操作的总值是指定的值。这意味着当你这样做时:
($handle = opendir('files'.'/'))
您不仅要将$handle
分配给opendir()
的结果,而且整个陈述也会评估该结果。
同样在PHP中,任何有效对象都被视为“truthy”,因此它可以在布尔检查中求值为true
。所以这个:
if ($handle = opendir('files'.'/'))
将opendir()
的结果分配给$handle
,和会检查true
或false
的分配结果。因此,如果opendir()
失败,则if
会看到false
并且未输入该块。
while
或任何其他检查作业结果的操作相同。
答案 1 :(得分:2)
在每种情况下,将值分配给变量,然后测试其真实性。
您可以将代码重写为:
$handle = opendir('files'.'/');
if ($handle) {
$file = readdir($handle);
while ($file) {
echo $file.'<br>';
$file = readdir($handle)
}
}
那么,这是否意味着if条件不可能失败?
如果opendir()
未返回真值,则会失败。例如,如果目录不存在,就会发生这种情况。
答案 2 :(得分:1)
这是一种可以在PHP中使用的编码风格
正在if语句中同时创建和评估变量。 opendir
如果失败则会返回false
,这意味着if
条件内的代码将无法运行。
一般来说这种风格并不是一个好主意,因为这种代码通常是一个==
的错误,例如if($variable=true)
和if($variable==true)
差异很大但不是如果你正在扫描代码,一定很容易发现。
在while循环中使用$file =
是一种非常正常的方法,用于迭代某些东西。
readdir
- http://php.net/manual/en/function.readdir.php - 可迭代,因此可以在此风格中使用