Имеет ли смысл закрывать файл, который не может быть открыт - PullRequest
2 голосов
/ 19 декабря 2011

Я проверяю код, написанный другим разработчиком. Код пытается открыть файл и устанавливает $canOpen в зависимости от успеха / неудачи.

$fh = @fopen('files.php', 'a+');        
if (!$fh){
   fclose($fh);
   $canOpen = false;
} else {
   $canOpen = true; 
}

Что я нахожу странным, так это то, что он также пытается закрыть файл, но только при сбое открытия if (!$fh). Имеет ли это смысл? Разве закрытие не должно быть в операторе else, когда файл был успешно открыт?

Ответы [ 4 ]

1 голос
/ 19 декабря 2011

Нет, это не имеет смысла, если вы не можете открыть файл, вам не нужно будет его закрывать.На этом этапе указатель файла всегда открыт, потому что если файл не существует, он создаст файл.

1 голос
/ 19 декабря 2011

Единственная причина, по которой можно закрыть нераспечатанный файл, это если он используется для обеспечения устойчивости.Например, всегда закрывая файл в блоке finally try...catch.

В вашем случае это выглядит как ошибка кодирования.

1 голос
/ 19 декабря 2011

если вы поместите var_dump ($ fh) в истинный блок вашего if, вы обнаружите, что это не дескриптор ресурса.

В руководстве php указано , что fclose берет ресурс. Поэтому fclose не может быть вызвано для файла, который не может быть открыт.

<?php
$fh = @fopen('files.php', 'a+');

if (!$fh){
    var_dump( $fh );
    fclose($fh); // this will cause an error
    $canOpen = false;
} else {
    $canOpen = true; 
}
1 голос
/ 19 декабря 2011

Нет, это не имеет смысла.

Если !$fh выполнено как условие, это означает, что $fh содержит логическое значение FALSE (или, возможно, в случае какой-то странной внутренней ошибки PHP), NULL).То, что вы фактически делаете, это:

fclose(FALSE);

... что бессмысленно и приведет к ошибке.

И, если все, что вы пытаетесь сделать, это заполнить $canOpen переменная и не делать ничего полезного с дескриптором файла, не будет ли достаточной комбинация is_file(), is_readable() и is_writable()?

...