我正在审查由另一个开发人员编写的代码。代码尝试打开一个文件,并根据成功/失败设置$canOpen。
$fh = @fopen('files.php', 'a+');
if (!$fh){
fclose($fh);
$canOpen = false;
} else {
$canOpen = true;
}我发现奇怪的是,它也试图关闭文件,但只有当打开失败的if (!$fh)。这有意义吗?当文件成功打开时,关闭语句不应该在else语句中吗?
发布于 2011-12-20 00:52:43
不,这没有任何意义。
如果满足!$fh条件,则意味着$fh包含布尔值FALSE (或者,如果出现一些奇怪的内部PHP错误,则可能是NULL)。因此,您实际上正在做的是:
fclose(FALSE);...which是没有意义的,并且会导致错误。
而且,如果您所要做的只是填充$canOpen变量,而没有对文件句柄做任何有用的事情,那么is_file()、is_readable()和is_writable()的组合还不够吗?
发布于 2011-12-20 00:53:22
关闭未打开的文件的唯一原因是它是出于弹性目的。例如,总是关闭try...catch的finally块中的文件。
在您的情况下,它看起来像是编码错误。
发布于 2011-12-20 00:53:34
如果您将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;
}https://stackoverflow.com/questions/8564551
复制相似问题