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

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

Generators PHP 5.5

Генераторы в PHP 5.5 одна из самых новых возможностей, которая обеспечивает способ обработки итерации без потребности писать класс, который реализует Iterator interface. С помощью генераторов можно значительно уменьшить размер и сложность кода, который разработчики должны написать.

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

Рассмотрим пример функции range(), которая возвращает массив значений аргументов между $start и $end.

Использование функции range():
<?php
foreach (range(0, 1000000) as $number) {
    echo $number;
}

В этом примере есть проблема; массив возвращаемых range() который будет занимать много памяти, больше чем 100 Мб. Этот код — демонстрация, но есть много ситуаций, где создаются большие массивы данных, и они занимают много времени и памяти.

С введением генераторов в PHP 5.5, можно легко решить эту проблему. Рассмотрим модификацию кода, используя генератор, производящий диапазон значений:

<?php
// define a simple range generator
function generateRange($start, $end, $step = 1) {
    for ($i = $start; $i < $end; $i += $step) {
        // yield one result at a time
        yield $i;
    }
}
foreach (generateRange(0, 1000000) as $number) {
    echo $number;
}

Этот код выполняет то же самое что и в первом примере, но не создаёт большого массива для хранения всех значений. Это уменьшает объем памяти меньше одного килобайта — огромная экономия по сравнению с первым примером кода.

к меню ↑

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

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

В новом API есть две новые функций password_hash() и password_verify(). Вызов password_hash($password, PASSWORD_DEFAULT) возвращает сильную путаницу, используя bcrypt с солью автоматически.

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

к меню ↑

PHP 5.5 finally

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

Без ключевого слова finally, разработчики иногда были вынуждены повторять код в try и catch очистки дескриптора задачи. Например, в следующем примере вызов 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() в блок finally, который будет вызываться всегда. Хотя блок try и возвращает значение, блок finally по-прежнему будет выполняется перед оператором return и выполнение программы будет продолжается.

к меню ↑

Массивы и снятие строковых литералов

Массив и строковые литералы могут теперь быть сняты к доступу с массива, используя синтаксис:

<?php
// array dereferencing — returns 3
echo [1, 3, 5, 7][1];
// string dereferencing — returns "l"
echo "hello"[3];

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

<?php
$randomChar = "abcdefg0123456789"[mt_rand(0, 16)];
к меню ↑

Функции и Выражения empty()

empty() — теперь можно использовать с помощью вызовов функций и других выражений. Например: empty($object->getProperty()) это корректный код в PHP 5.5. Это делает возможным использование empty() на возвращаемое значение функции без записи значения в переменной.

к меню ↑

Разрешить имена классов

С момента введения пространства имен в PHP 5.3, стало обычным делом широко использовать пространство имен, организовывать классы в PHP проектах например: Парсинг XML С SimpleXML

Однако, до сих пор трудно получить полное имя класса в виде строки. Рассмотрим следующий код:

use Namespaced\Class\Foo;
$reflection = new ReflectionClass("Foo");

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

<?php
use NamespacedClassFoo;
$reflection = new ReflectionClass("Foo");

Теперь код будет работать как нужно, а Foo:class разрешен в Namespaced\\Class\\Foo.

к меню ↑

Изменения foreach

list() в PHP 5.5, разрешает значение массива, чтобы легко назначить переменные. Например:

$values = ["sea", "blue"];
list($object, $description) = $values;
// returns "The sea is blue"
echo "The $object is $description";

Теперь можно использовать list() с многомерными массивами в пределах петли foreach. Например:

<?php
$data = [
    ["sea", "blue"],
    ["grass", "green"]
];
foreach ($data as list($object, $description)) {
    echo "The $object is $descriptionn";
}
/* Outputs:
The sea is blue
The grass is green
*/

Это новое мощное средство, которое имеет потенциал, чтобы сделать итерации через вложенные массивы гораздо проще и чище.

Петли foreach могут также обработать не скалярных значения как итератор ключей, что означает, что элемент ключей может иметь значение, которые не являются строкой или целым числом.

к меню ↑

В заключение

PHP 5.5 предлагает множество улучшений для облегчения разработки PHP. Помимо новых функций, был исправлен длинный список ошибок (см. список изменений для подробностей), и различные оптимизации, усовершенствования для улучшения производительности и стабильности.