我正在审核由其他开发人员编写的代码。代码尝试打开文件,并根据成功/失败设置$canOpen
。
$fh = @fopen('files.php', 'a+');
if (!$fh){
fclose($fh);
$canOpen = false;
} else {
$canOpen = true;
}
我觉得很奇怪的是它也会尝试关闭文件,但只有当打开失败时才会if (!$fh)
。这有意义吗?文件成功打开后,关闭是否应该在else语句中?
答案 0 :(得分:1)
不,这没有任何意义。
如果满足!$fh
作为条件,则意味着$fh
包含布尔FALSE
(或者,如果出现一些奇怪的内部PHP错误,NULL
) 。所以你实际做的是:
fclose(FALSE);
......这是毫无意义的,会导致错误。
而且,如果你要做的就是填充$canOpen
变量而不对文件句柄做任何有用的事情,那么is_file()
,is_readable()
和is_writable()
足够吗?
答案 1 :(得分:1)
关闭未打开文件的唯一原因是它是否用于弹性目的。例如,始终关闭finally
的{{1}}块中的文件。
在您的情况下,它看起来像编码错误。
答案 2 :(得分:1)
如果你将var_dump($ fh)放在if的true块中,你会发现它不是资源句柄。
fclose占用资源的php manual states。因此,无法在无法打开的文件上调用fclose。
<?php
$fh = @fopen('files.php', 'a+');
if (!$fh){
var_dump( $fh );
fclose($fh); // this will cause an error
$canOpen = false;
} else {
$canOpen = true;
}
答案 3 :(得分:1)
不,它没有意义,如果你无法打开文件,你就不需要关闭它了。此时,filepointer始终处于打开状态,因为如果文件不存在,则会创建一个文件。