Что нового в PHP 5.5?

14.09.2013

Совсем недавно состоялся релиз PHP 5.5, в котором было введено несколько новинок, делающих язык ещё более мощным. В этой статье, мы пройдёмся по самым интересным нововведениям, и посмотрим какие возможности они открывают разработчикам.

Генераторы

Генераторы — это одна из самых ожидаемых новинок. Данное нововведение позволяет производить итерацию без создания класса имплементирующего интерфейс Iterator. Создание отдельного класса — это дополнительный код. Теперь, с помощью генераторов, этого можно избежать, уменьшив размер и сложность кода.

Использование генераторов осуществляется через новое ключевое слово yield. Сами они очень похожи на обычные функции, но вместо одного возвращаемого значения, генератор может вернуть любое число значений.

Для того чтобы понять смысл генераторов, нужно привести пример. В PHP есть функция range(), которая возвращает массив случайных чисел в заданном диапазоне, между значениями аргументов $start и $end. Мы можем ею воспользоваться следующим образом:

<?php
foreach (range(0, 1000000) as $number) {
    echo $number;
}

Главная проблема данного примера в том, что согласно PHP документации, массив значений, возвращаемый range() сожрёт больше 100mb памяти. Поскольку данный пример это простая демонстрация подобной проблемы, существует множество довольно-таки серьёзных проектов, где подобные методы используются и задействуют слишком много ресурсов.

С появлением генераторов, данная проблема легко решается и без создания отдельного класса-итератора. Генераторы не создают огромный массив, а за одну итерацию возвращают один элемент. Теперь давайте посмотрим на тот же самый пример, только с использованием генератора:

<?php
// создаём простой генератор чисел
function generateRange($start, $end, $step = 1) {
    for ($i = $start; $i < $end; $i += $step) {
        // возвращаем один результат за итерацию
        yield $i;
    }
}

foreach (generateRange(0, 1000000) as $number) {
    echo $number;
}

Данный код делает то же самое, что и предыдущий, но без создания огромного массива с значениями. Согласно документации, данный пример сокращает использование памяти до 1kb – огромная экономия.

Хэширование паролей

Новый API для хэширования паролей — так же одно из наиважнейших нововведений в PHP 5.5. В прошлом, для этих целей разработчикам приходилось прибегать к использованию функции crypt(), которая была слабо освещена в PHP документации. Теперь благодаря специальному набору функций для хэширования паролей, разработчики с лёгкостью смогут применить новый способ защиты паролей на своих сайтах.

В новом API введено 2 новые функции: password_hash() и password_verify(). Вызов password_hash($password, PASSWORD_DEFAULT) вернёт стойкий хэш с помощью bcrypt + соль. Проверка пароля в будущем осуществляется с помощью функции password_verify($password, $hash).

По умолчанию, API использует bcrypt, но в будущем можно будет применять и другие алгоритмы для обеспечения большей безопасности. Разработчики могут использовать свои дополнительные фишки для усиления кэша, а так же использовать собственную соль.

finally

В PHP 5.5 было добавлено ключевое слово finally, которое довольно-таки часто встречается и в других языках. С помощью finally, мы можем создать блок кода, который выполнится в конце конструкции try/catch, вне зависимости от того, было выброшено исключение или нет.

Без finally, разработчикам часто приходилось делать двойной вызов каких-то функций или дублировать код. К примеру, в следующем примере вызов функции releaseResource() происходит в нескольких местах:

<?php
function doSomething() {
    $resource = createResource();
    try {
        $result = useResource($resource);
    }
    catch (Exception $e) {
        releaseResource($resource);
        log($e->getMessage());
        throw $e;
    }
    releaseResource($resource);
    return $result;
}

Воспользуемся новым ключевым словом finally:

<?php
function doSomething() {
    $resource = createResource();
    try {
        $result = useResource($resource);
        return $result;
    }
    catch (Exception $e) {
        log($e->getMessage());
        throw $e;
    }
    finally {
        releaseResource($resource);
    }
}

Теперь функция releaseResource() будет вызвана единожды, вне зависимости от того будет выкинуто исключение или нет. Даже если в блоке try будет использоваться слово return, блок finally выполнится в любом случае.

Обращение к строкам, как к массивам

Теперь мы можем извлекать отдельные символы из строк, обращаясь к ним как к индексам массивов:

<?php
// возвращает 3
echo [1, 3, 5, 7][1];

// возвращает "l"
echo "hello"[3];

Данная возможность не является какой-то революционной, а служит очередной попыткой приблизить PHP к другим языкам программирования. Однако, использовать её можно довольно-таки оригинальным способом:

<?php
$randomChar = "abcdefg0123456789"[mt_rand(0, 16)];

Применение функции empty() к функциям и выражениям

Теперь мы можем применять функцию empty() к функциям и выражениям. К примеру, запись empty($object->getProperty()) теперь валидна, начиная с PHP 5.5. Это даёт нам возможность сразу проверять возвращаемое значение функции, без использования дополнительной переменной.

Доступ к имени класса

В PHP 5.3 было введено такое понятие, как пространство имён, что привело к новым принципам организации классов в PHP проектах. Однако, до сих пор извлечь строковое имя класса довольно-таки проблематично. Давайте рассмотрим следующий код:

<?php
use Namespaced\Class\Foo;

$reflection = new ReflectionClass("Foo")

Возникнет ошибка, так как PHP попытается вызвать глобальный класс Foo, вместо того, который нам нужен. В PHP 5.5, с помощью поля class, появилась возможность извлечения имени класса в рамках пространства имён в строковом виде:

<?php
use Namespaced\Class\Foo;

$reflection = new ReflectionClass(Foo::class);

Таким образом Foo:class вернёт Namespaced\\Class\\Foo.

Расширение возможностей foreach

Функция list() присваивает переменным из списка значения подобно массиву. К примеру:

<?php
$values = ["sea", "blue"];

list($object, $description) = $values;

// вернёт "The sea is blue"
echo "The $object is $description";

Теперь мы можем использовать функцию list() для прокрутки значений в цикле foreach. К примеру:

Благодаря новой возможности, вы можете писать более чистый и понятный код.

Так же, теперь foreach может взаимодействовать с не скалярными значениями в качестве ключей. Это значит что теперь для ключей мы можем использовать не только строки и целые числа.

Заключение

В PHP 5.5 много хороших новинок, которые пригодятся при разработке. В добавок ко всему этому было исправлено куча ошибок и багов, возникших после предыдущих релизов. Так же, разработчики языка хорошенько поработали над улучшением производительности.


Источник:

Другие темы:

Таймер обратного отсчета на jQuery
Видеокурс «Секреты практического SEO»
Система управления ссылками ReDirector 3.0 скидка 15%
Программирование микроконтроллеров на языке С