Что нового в PHP 5.5
-
Wiki: PHP 5.5
- php.net: Новые возможности в PHP 5.5
[1,3,4][2], "foobar"[2]
— разыменования созданных массивов/строк
echo array(1, 2, 3)[0]; // 1 echo [1,3,4][2]; // 4 echo "foobar"[0] // f // это может пригодиться для быстрой генерации: echo 'abcdefghijk'[ rand(0,10) ]; // получим одну из букв: 'abcdefghijk'
empty()
— можно применять к результатам функций и выражений
Раньше empty() мог принимать только переменные, теперь можно передавать сами выражения без необходимости сохранять результат в отдельную переменную:
empty( $object->get() );
list() в foreach
В foreach стало возможным использовать list():
$array = [ [1, 2], [3, 4], ]; foreach( $array as list($a, $b) ){ echo $a; echo $b; } // получим: 1234
finally
— в конструкции try/catch
Выбрасывать и ловить исключения можно с PHP 5. Такой подход позволяет контролировать выполнение кода, если есть подозрение, что в нем что-то может пойти не так.
А с версии 5.5. в эту конструкцию добавили третий блок finally
. Блок finally выполняется всегда после завершается конструкции try/catch. Он выполняется даже когда код try вызвал фатальную ошибку:
try { echo 'Тут что-то деламе... '; // выбрасываем throw new Exception('Лови меня! '); } // ловим catch( Exception $e ){ echo $e->getMessage(); // выведет: Лови меня! } finally { echo 'А это выводиться всегда!'; }
Нужен finally для удобства, и дополнительных возможностей. С ним можно будет писать меньше кода и можно, например, удобно чистить память, когда это нужно.
Пару домонстрационных примеров:
Меньше кода
Допустим, нам нужно выполнить функцию close() в любому случае, было выброшено исключение или нет:
try { my_function(); } catch( Exception $e ){ // close(); // эта строка нужна была бы без finally echo $e->getMessage(); // выведет: Лови меня! } finally { close(); } //close(); // эта строка нужна была бы без finally
Больше возможностей
Допустим мы открыли соединение с БД до выполнения кода и есть вероятность что код вызовет ошибку и открытое соединение не закроется, а нам нужно его закрыть в любом случае. finally как раз кстати:
$db = mysqli_connect(); try { my_function( $db ); // результат работы функции может вызвать фатальную ошибку... } // исключение можно не обрабатывать finally { mysqli_close($db); }
- Подробнее про finally читайте статью на хабре.
Class::class
— для получение имени класса в пространствах
Появилось ключевое слово class
для классов, которое выводит название класса. В обычном режиме нам это не нужно, а вот при работе с пространствами (namespace) — это удобно:
namespace test; class A {} echo A::class; //> test\A
yield
— создание генераторов
Если говорить простым языком: yield
похожа на return, она также возвращает значение, но она не обрывает работу функции, а приостанавливает её до тех пор пока не будет запрошено следующее значение. Благодаря этому создавать генераторы стало удобнее.
Пример генератора:
function generator() { for( $i = 1; $i <= 3; $i++ ){ yield $i; // выброс значения } } foreach( generator() as $value ){ echo "$value "; } // выведет: '1 2 3 '
Как это работает на самом деле?
yield
возвращает специальный объект — Generator. Когда функция generator() вызывается в цикле, например foreach, PHP выполнит код функции до первой встречи слова yield, на котором PHP прервет работу функции, запомнит позицию и выбросит значение (объект Generator). Затем, foreach обработает значение и вызовет метод next() у полученного объекта Generator. PHP снова выполнит код функции generator(), только начнет его не с начала, а с прошлой позиции, и опять, до слова yield, которое опять выбросит объект Generator. Работа цикла прервется тогда, когда функция generator() дойдет до конца (не вернет yield), или если она будет прервана с помощью return;
.
Пример передачи генератора в переменную (повторный вызов в этом случае не работает):
function generator() { for( $i = 1; $i <= 3; $i++ ){ yield $i; // выброс значения } } $gen = generator(); foreach( $gen as $value ){ echo "$value "; } // выведет: '1 2 3 ' // Fatal error: Uncaught Exception: Cannot traverse an already closed generator foreach( $gen as $value ){ echo "$value "; }
Пример генератора который возвращает пару: ключ/значение:
function generator( $input ){ foreach( explode('.', $input) as $part ){ list( $num, $name ) = explode(' - ', $part ); yield $num => trim($name); } } $input = '1 - один. 2 - два. 3 - три'; foreach( generator( $input ) as $num => $name ){ echo "$num ($name) "; }
Кратко о генераторах
- Не добавляют нового функционала в язык
- Быстрее
- Возобновление работы генератора происходит с последнего «выброса» yield
- В генератор можно отправлять значения и исключения (через метод throw())
- Генераторы однонаправлены, т.е. нельзя вернуться назад
- Меньше кода в большинстве случаев, более простые для понимания конструкции
-
Чтобы лучше понять генераторы прочитайте эту статью на Хабре.
- Подробно о генераторах в документации (англ.)
API для хэширования паролей
habrahabr.ru: API хэширования паролей в PHP 5.5.
Теперь PHP из коробки предлагает правильный способ хэшировать пароли. Новый API хэширования паролей предоставляет четыре функции:
-
password_hash()
— используется для хэширования пароля. В WP для этого есть своя функция wp_hash_password().$hash = password_hash( $passwod, PASSWORD_DEFAULT );
-
password_verify()
— используется для проверки пароля на соответствие хэшу. В WP для этого есть своя функция wp_check_password().if( password_verify( $password, $hash ) ){ // Success! }
-
password_needs_rehash()
— используется для проверки необходимости создать новый хэш. password_get_info()
— возвращает имя алгоритма хеширования и различные параметры, используемые при хэшировании.
—