<rmcreative>

RSS

Что нас ждёт в 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)

Отдельно стоит отметить предложение улучшенной компиляции через построение AST. В 5.5 реализации точно не будет, но штука интересная.

Сейчас PHP компилируется по мере выполнения. Всё делается в один проход. В RFC предлагается перейти к двупроходной компиляции. Сначала парсер будет разбирать всё в дерево. Затем уже это дерево будет компилироваться. Посередине будет возможность засунуть разные хорошие оптимизации.

С одной стороны получаются дополнительные расходы на компиляцию, с другой, при использовании APC получается сильный выигрыш на более оптимальных инструкциях для Zend Engine.

Также данное изменение упростит код компилятора, что положительно скажется на дальнейшем развитии PHP.

Комментарии RSS

  1. №6834
    idle
    idle 16 окт. 2012 г., 7:35:27

    Как же станет грустно Фабьену, как только появится AST и функции для прохода по нему из пользовательского пространства — twig придётся лишить его очаровательных костылей.

  2. №6835
    Skiller
    Skiller 16 окт. 2012 г., 8:09:29

    Зачем Foobar::class если через get_class можно получить тоже самое? Пропуск параметров функций вообще непонятно что предназначен улучшить, понимаю если сделать параметризированные как в python, а тут какой-то костыль. Ну и свойства класса через геттеры и сеттеры еще один костыль, кому это надо? что действительно так сложны использовать обычные методы чем это?эх... из C# походу что-то хотели стащить да неудачно.

  3. №6837
    RusAlex
    RusAlex 16 окт. 2012 г., 8:50:45

    я больше всего жду скаляры в указании типов аргументов для ф-ций. Но вот что-то меня не впечатляет, все равно как-то коряво получается:

    'true' == bool '0' == bool

    т.е. почти скаляры, но в кавычках будут пролезать в ваши ф-ции как аргумент "на ура".

  4. №6839
    Grigori
    Grigori 16 окт. 2012 г., 11:00:43

    Тайпхинтинга скаляров не будет (С) Размус.

  5. №6840
    Sam
    Sam 16 окт. 2012 г., 11:36:14

    Grigori, это Расмус говорил про жёсткий хинтинг без кастинга. Это новый RFC.

  6. №6841
    Николай
    Николай 16 окт. 2012 г., 12:43:17

    Parse error: foreachlist example, line 3

    А так да, выглядит многообещающе. Разработчики, вслед за ECMA наконец-то переключились на копирование сильных сторон Python. Это уже повод подумать как следует, прежде чем переключаться на питон.

    empty давным-давно следовало сделать полноценным оператором.

    PHP 5.5 не будет работать на Windows XP и 2003.

    Наиболее вероятное нововведение :)

  7. №6842
    idle
    idle 16 окт. 2012 г., 12:55:31

    Это уже повод подумать как следует, прежде чем переключаться на питон.

    Вряд ли. До стадии «подумать как следует» ещё долго рихтовать %)

  8. №6845
    Рустам
    Рустам 16 окт. 2012 г., 14:54:03

    Нашёл тут англоязычный подкаст, в котором обсуждается 5.5 и не только: alexoid.users.phpclasses.org/blog/post/193-PHP-55-Release-Date-and-Plans--Lately-in-PHP-podcast-episode-28.html#1963

  9. №6850
    Lekz
    Lekz 18 окт. 2012 г., 21:38:14

    Коментарии в примере использования генератора не корректные. Если верить wiki.php.net, не на каждой итерации всё выполняется.

  10. №6851
    Sam
    Sam 18 окт. 2012 г., 22:38:08

    Возможно, я что-то не так там понял. Как правильно?

  11. №6866
    white-shadow
    white-shadow 20 окт. 2012 г., 11:05:43

    @idle

    twig придётся лишить его очаровательных костылей. как связано появление AST и twig, и что за очаровательные костыли?!

  12. №6867
    white-shadow
    white-shadow 20 окт. 2012 г., 11:06:53

    hm...

    @idle

    twig придётся лишить его очаровательных костылей.

    как связано появление AST и twig, и что за очаровательные костыли?!

  13. №6868
    idle
    idle 20 окт. 2012 г., 12:21:34

    @white-shadow

    twig — это продолжение заброшенного Армином порта jinja на PHP. В основе jinja лежат манипуляции с AST, которые в PHP не представляются возможными. Чтобы как-то соответствовать идеологии jinja в twig приходится представлять инструкции в виде литералов, что не только выглядит некультурно, но и местами затрудняет разработку пользовательских тегов. Вот такие костыли.

  14. №6872
    lance
    lance 20 окт. 2012 г., 15:18:22

    Свойства класса через геттеры и сеттеры. it's cool

  15. №6942
    Алексей
    Алексей 30 окт. 2012 г., 16:00:16

    В связи с yield буду ждать когда появятся блоки. Например:

    // Вывести заголовки публикаций
    $posts->each { |$post| echo $post->title; }
     
    // Открыть файл, вывести построчно и закрыть его
    new File('text.txt') { |$line|  echo $line; }

    А ещё было бы здорово, если последнее выражение в методе станет возвращаемым значением =)

  16. №7060
    Игорь
    Игорь 17 нояб. 2012 г., 20:32:47

    Генераторы - очень приятно, хотелось бы еще Type Hinting, обещали в 5.4, но так и не добавили...

  17. №7576
    Den
    Den 23 февр. 2013 г., 13:41:57

    Опять обломали с нативным UTF8 в строковых функциях, Python хоть соответсвует стандартам

    mbstring для упырей

  18. №7702
    zedget
    zedget 18 марта 2013 г., 16:34:59

    Отсутствие поддержки ХР - важно-неожиданное нововведение :)

  19. №7923
    Ivan1986
    Ivan1986 09 мая 2013 г., 18:30:43

    Отсутствие поддержки ХР - важно-неожиданное нововведение :)

    Там нужно было убрать XP и 2003 - так было бы лучше

  20. №7924
    Sam
    Sam 09 мая 2013 г., 20:45:47

    Ivan1986, думаю, на 2003 также не заработает.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.