Что нас ждёт в PHP 5.5
16 октября 2012
PHP 5.5 планируется выпустить в Феврале-Марте 2013. Отвечать за релиз в этот раз будет Julien Pauli, который приедет на WebConf в ноябре.
Версия 5.5 будет обратно совместма с остальной линейкой 5.x, так что можно будет смело обновляться. Итак, интересности из транка, которые, возможно, попадут в 5.5.
foreachlist
Интересное добавление к синтаксису:
$users = array( array('Foo', 'Bar'), array('Baz', 'Qux'); ); // раскидываем массив в переменные foreach ($users as $user) { list($firstName, $lastName) = $user; echo "First name: $firstName, last name: $lastName. "; } // а вот так можно будет в 5.5 foreach ($users as list($firstName, $lastName)) { echo "First name: $firstName, last name: $lastName. "; }
generators
Генераторы — новый способ довольно сжато описывать эффективно работающие итераторы, используя минимум кода. Функция или метод, в котором встречается ключевое слово yield
автоматически становится генератором:
function getLinesFromFile($fileName) { // на каждой итерации выполняем всё до первого yield if (!$fileHandle = fopen($fileName, 'r')) { return; } // while (false !== $line = fgets($fileHandle)) { // то есть до сюда yield $line; } // а вот эта часть выполнится только когда не вызовется yield fclose($fileHandle); } // выполнения функции не происходит потому как внутри есть yield $lines = getLinesFromFile($fileName); foreach ($lines as $line) { // работаем с $line }
Работает всё это довольно шустро.
hash_pbkdf2
Новая функция hash_pbkdf2
замедляет обычное хеширование (например, SHA-256) для того, чтобы сделать перебор достаточно трудоёмким занятием, которое может растянуться на десятилетия.
Данную тему я уже затрагивал.
Кстати, в документации к hash_pdkdf2
имеется замечание, что для паролей всё-таки лучше использовать crypt
.
Упрощённый API для хеширования паролей
Так как хеширование паролей необходимо в большинстве приложений, разрабатываемых на PHP и при этом очень многие не понимают, как это сделать правильно, Anthony Ferrara, поработавший над RFC и реализацией, решил эту задачу упростить.
Вот так будет выглядеть сохранение пароля:
$password = "foo"; $hash = password_hash($password, PASSWORD_DEFAULT); // записываем хеш в базу
А вот так его проверка:
// читаем хеш из базы if (password_verify($password, $hash)) { // пароль верный } else { // пароль не верный }
Разыменование констант, строк и массивов
Можно будет так:
echo array(1, 2, 3)[0]; // 1 echo "foobar"[2]; // o echo "foobar"["foo"][0] // f echo [1,3,4][2]; // 4 echo ['a', 'b'][mt_rand(0, 1)]; // a или b
empty заработает с функциями
Это сильно упростит всем нам жизнь:
if(!empty($this->getPosts()) { // ... }
Другие изменения (не факт, что все будут в 5.5)
- Выкинули модификатор
/e
изpreg_replace
в пользуpreg_replace_callback
. - PHP 5.5 не будет работать на Windows XP и 2003.
- Функция
boolval
. Аналог(bool)
. - Получение полного имени класса с namespace через
FooBar::class
. - Пропуск параметров функций.
- Скалярный хинтинг для функций.
- Свойства класса через геттеры и сеттеры.
Отдельно стоит отметить предложение улучшенной компиляции через построение AST. В 5.5 реализации точно не будет, но штука интересная.
Сейчас PHP компилируется по мере выполнения. Всё делается в один проход. В RFC предлагается перейти к двупроходной компиляции. Сначала парсер будет разбирать всё в дерево. Затем уже это дерево будет компилироваться. Посередине будет возможность засунуть разные хорошие оптимизации.
С одной стороны получаются дополнительные расходы на компиляцию, с другой, при использовании APC получается сильный выигрыш на более оптимальных инструкциях для Zend Engine.
Также данное изменение упростит код компилятора, что положительно скажется на дальнейшем развитии PHP.
Комментарии RSS по email OK
Как же станет грустно Фабьену, как только появится AST и функции для прохода по нему из пользовательского пространства — twig придётся лишить его очаровательных костылей.
Зачем Foobar::class если через get_class можно получить тоже самое? Пропуск параметров функций вообще непонятно что предназначен улучшить, понимаю если сделать параметризированные как в python, а тут какой-то костыль. Ну и свойства класса через геттеры и сеттеры еще один костыль, кому это надо? что действительно так сложны использовать обычные методы чем это?эх... из C# походу что-то хотели стащить да неудачно.
я больше всего жду скаляры в указании типов аргументов для ф-ций. Но вот что-то меня не впечатляет, все равно как-то коряво получается:
'true' == bool '0' == bool
т.е. почти скаляры, но в кавычках будут пролезать в ваши ф-ции как аргумент "на ура".
Тайпхинтинга скаляров не будет (С) Размус.
Grigori, это Расмус говорил про жёсткий хинтинг без кастинга. Это новый RFC.
Parse error: foreachlist example, line 3
А так да, выглядит многообещающе. Разработчики, вслед за ECMA наконец-то переключились на копирование сильных сторон Python. Это уже повод подумать как следует, прежде чем переключаться на питон.
empty давным-давно следовало сделать полноценным оператором.
Наиболее вероятное нововведение :)
Вряд ли. До стадии «подумать как следует» ещё долго рихтовать %)
Нашёл тут англоязычный подкаст, в котором обсуждается 5.5 и не только: alexoid.users.phpclasses.org/blog/post/193-PHP-55-Release-Date-and-Plans--Lately-in-PHP-podcast-episode-28.html#1963
Коментарии в примере использования генератора не корректные. Если верить wiki.php.net, не на каждой итерации всё выполняется.
Возможно, я что-то не так там понял. Как правильно?
@idle
hm...
@idle
как связано появление AST и twig, и что за очаровательные костыли?!
@white-shadow
twig — это продолжение заброшенного Армином порта jinja на PHP. В основе jinja лежат манипуляции с AST, которые в PHP не представляются возможными. Чтобы как-то соответствовать идеологии jinja в twig приходится представлять инструкции в виде литералов, что не только выглядит некультурно, но и местами затрудняет разработку пользовательских тегов. Вот такие костыли.
Свойства класса через геттеры и сеттеры. it's cool
В связи с yield буду ждать когда появятся блоки. Например:
А ещё было бы здорово, если последнее выражение в методе станет возвращаемым значением =)
Генераторы - очень приятно, хотелось бы еще Type Hinting, обещали в 5.4, но так и не добавили...
Опять обломали с нативным UTF8 в строковых функциях, Python хоть соответсвует стандартам
mbstring для упырей
Отсутствие поддержки ХР - важно-неожиданное нововведение :)
Там нужно было убрать XP и 2003 - так было бы лучше
Ivan1986, думаю, на 2003 также не заработает.