Что такое блок finally в PHP?

«Что такое блок finally в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Блок finally — это необязательная часть конструкции try-catch в PHP, которая выполняется всегда, независимо от того, было выброшено исключение или нет. Его основное предназначение — код "очистки" (cleanup), который должен быть выполнен в любом сценарии, например, освобождение ресурсов (закрытие файловых дескрипторов, соединений с БД, снятие блокировок).

Ключевое поведение:

$resource = null;
try {
    $resource = fopen('data.txt', 'r');
    // Чтение данных...
    if (someCondition()) {
        return 'Early Return'; // finally ВСЁ РАВНО выполнится!
    }
    // Другие операции, которые могут выбросить исключение...
} catch (IOException $e) {
    echo "Ошибка ввода-вывода: {$e->getMessage()}";
    throw new RuntimeException('Wrapped', 0, $e); // finally ВСЁ РАВНО выполнится!
} finally {
    // Этот код выполнится в ЛЮБОМ случае:
    // после успешного завершения try, после catch, даже после return или нового throw.
    if ($resource !== null && is_resource($resource)) {
        fclose($resource); // Критически важно закрыть ресурс
        echo "Файл закрыт.n";
    }
}
// Если в finally не было своего return/throw, выполнение продолжится здесь.

Важные нюансы:

  1. Возврат значения: Если в блоке finally есть оператор return, он переопределит любой return из блоков try или catch.
    function test() {
        try {
            return 'from try';
        } finally {
            return 'from finally'; // Это значение будет возвращено функцией!
        }
    }
    echo test(); // Выведет: 'from finally'
  2. Исключения: Если исключение выброшено в finally, оно "затенит" любое исключение, выброшенное ранее в try или catch.
  3. Порядок выполнения: Сначала выполняется try/catch, затем finally, и только потом происходит возврат значения или проброс исключения (если они были определены в try/catch).