Pull to refresh

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

PHP *
Translation
Original author: Xinchen Hui
Не так давно, Никита Попов, один из активистов движения «ЗА 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
Tags:
Hubs:
Total votes 39: ↑32 and ↓7 +25
Views 10K
Comments Comments 41