В PHP 5.5 возможно появится Finally

в 8:31, , рубрики: php, php 5.5, rfc, try catch, try finally

Не так давно, Никита Попов, один из активистов движения «ЗА PHP», опубликовал в своём твиттере сообщение:

It very much looks like PHP 5.5 will have `finally` t.co/Dy93CZaR

(Оригинал тут twitter.com/nikita_ppv/status/232930291625369600)

Далее, вольный перевод:

Представление

В этом выпуске RFC, мы попробуем представить вам поддержку нового ключевого слова "finally" в исключениях.

Без этой фичи, разрабочикам приходится часто писать конструкции вида:

<?php
$db = mysqli_connect();
try {
   call_some_function($db);
} catch (Exception $e) {
   mysqli_close($db);
   throw $e;
}
mysql_close($db);

С введением finally, мы не говорим, что вам придётся писать меньше кода, мы говорим, что вы получите больше возможности для управления конструкциями try/catch

Предложение

Блок finally всегда выполняется когда завершается блок try/catch
Это означает, что блок finally выполняется даже, если было выкинуто исключение. Однако finally, на самом деле полезнее, чем простая обработка исключений. Оно позволяет программистам избегать лишних конструкций для чистки памяти иили соединений в момент обработки исключений или же, если они не были пойманы.

<?php
$db = mysqli_connect();
try {
   call_some_function($db);// функция моджет выкинуть исключение, которое мы можем и не обработать
} finally {
   mysqli_close($db);

}

Щекотливым моментом, при использовании новой конструкции, это испльзование конструкции return в блоке try/catch, в этом случае, блок finally всё равно будет вызван.

<?php
  try {
    return 2;
  } finally {
    echo "Этот текст мы увидимn";
  }
  //Этот текст мы увидим
  echo "Этот текст мы НЕ увидим";

результатом будет:


Этот текст мы увидим
//return int(2)

Ну и в случае вложенных конструкций try/catch/finally:

<?php
function foo ($a) {
   try {
      echo "1";
      try {
        echo "2";
        throw new Exception("ex");
      } catch (Exception $e) {
        echo "3";
      } finally {
        echo "4";
        throw new Exception("ex");
      }
   } catch (Exception $e) {
      echo "3";
   } finally {
      echo "2";
   }
   return 1;
}
 
var_dump(foo("para"));

получим:

123432int(1)

Тесты и Примеры

Так же множество примеров и кейсов, вы можете подсмотреть далее

https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_001.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_002.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_003.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_004.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_005.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_006.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/try_finally_001.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/try_finally_002.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/try_finally_003.phpt

Автор: okopok


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js