Закрывает ли PHP файл после того, как обработчик файлов собран из мусора?

Если у меня есть короткая функция, которая открывает файл и читает строку, мне нужно закрыть файл? Или PHP сделает это автоматически, когда выполнение завершит выполнение функции, а $fh – сбор мусора?

 function first_line($file) { $fh = fopen($file); $first_line = fgets($fh); fclose($fh); return $first_line; } 

тогда можно было бы упростить

 function first_line($file) { return fgets(fopen($file)); } 

Это, конечно, сейчас теоретически, так как в этом коде нет обработки ошибок .

PHP автоматически запускает деструктор ресурса, как только все ссылки на этот ресурс удаляются.

Поскольку у PHP есть сборка мусора, основанная на подсчете ссылок, вы можете быть достаточно уверены, что это произойдет как можно раньше, в вашем случае, как только $fh выходит за рамки.

До PHP 5.4 fclose фактически ничего не делал, если вы попытались закрыть ресурс, на который было назначено более двух ссылок.

Да. Ресурсы выпускаются автоматически, когда они выходят за рамки. Для остроумия:

 <?php class DummyStream { function stream_open($path, $mode, $options, &$opened_path) { echo "open $path<br>"; return true; } function stream_close() { echo "close<br>"; return true; } } stream_wrapper_register("dummy", "DummyStream"); function test() { echo "before open<br>"; fopen("dummy://hello", "rb"); echo "after open<br>"; } test(); ?> 

Вывод:

 before open open dummy://hello close after open 

Ручка файла будет выпущена, как только fopen () вернется, так как здесь ничего не происходит, захватив дескриптор.

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

Что-то, на что нужно обратить внимание, – это функция коллекции Garbage Collection, представленная в PHP 5.3 и выше.