Недавно был выпущен PHP 5.5, в котором появилось несколько новых интересных функций. В этой статье мы рассмотрим некоторые из наиболее интересных дополнений и обсудим преимущества, которые они предоставляют разработчикам.
Генераторы
Генераторы — одна из самых ожидаемых новых функций. Они предоставляют способ обработки итерации без написания класса, который реализует интерфейс Iterator
. Приведение класса в соответствие с интерфейсом Iterator требует значительного количества стандартного кода, поэтому возможность избежать этого с помощью генераторов может значительно уменьшить размер и сложность кода, который должны писать разработчики.
Генераторы получают свою функциональность из нового ключевого слова yield
Генератор выглядит очень похоже на обычную функцию, но вместо того, чтобы возвращать одно значение, генератор может выдать любое количество значений.
Чтобы правильно проиллюстрировать мощность генераторов, нужен пример. Рассмотрим PHP-функцию range()
$start
$end
Мы можем использовать range()
<?php
foreach (range(0, 1000000) as $number) {
echo $number;
}
Проблема в этом примере заключается в том, что массив, возвращаемый range()
Хотя приведенный выше код является тривиальной демонстрацией, существует множество реальных ситуаций, в которых создаются большие массивы данных, которые зачастую занимают много времени для создания и занимают много памяти.
С введением генераторов теперь легко решить эту проблему без необходимости писать класс Iterator
Генераторы не создают большой массив, а скорее возвращают один элемент за раз, когда они повторяются. Рассмотрим эту модификацию вышеприведенного кода, теперь использую генератор для получения диапазона значений:
<?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()
Введение упрощенного набора функций для обработки хэширования паролей значительно облегчит разработчикам понимание и реализацию безопасного хэширования паролей для своих сайтов.
Новый API представляет две новые функции, password_hash()
password_verify()
Вызов password_hash($password, PASSWORD_DEFAULT)
bcrypt , с засолкой, обрабатываемой автоматически. Позднее подтвердить пароль так же просто, как проверить результат password_verify($password, $hash)
По умолчанию API использует bcrypt, но в будущем могут быть введены новые алгоритмы для обеспечения еще более безопасных методов хеширования. Разработчики могут указать свой собственный коэффициент работы bcrypt для регулировки прочности создаваемых хэшей, а также могут использовать свои собственные соли вместо автоматического генерирования соли (хотя в руководстве это не рекомендуется).
наконец
В 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())
Это позволяет использовать empty()
Разрешение имени класса
С момента появления пространств имен в PHP 5.3 стало обычной практикой использование обширного пространства имен для организации классов в проектах PHP. Однако до сих пор было трудно получить полное имя класса в виде строки. Рассмотрим следующий код:
<?php
use NamespacedClassFoo;
$reflection = new ReflectionClass("Foo");
Это не удастся, так как PHP попытается использовать глобальный класс Foo вместо класса пространства имен. В PHP 5.5 теперь возможно получить полное имя класса в пространстве имен в виде строки, используя ключевое слово class
<?php
use NamespacedClassFoo;
$reflection = new ReflectionClass(Foo::class);
Теперь это будет работать так, как задумано, поскольку Foo:class
Namespaced\Class\Foo
Изменения для foreach
Конструкция list()
в PHP позволяет легко присваивать значения массива переменным. Например:
<?php
$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. В дополнение к новым функциям в этом выпуске исправлен длинный список ошибок (подробности см. В журнале изменений), а также были сделаны различные оптимизации и улучшения для повышения производительности и стабильности.
Будете ли вы переходить на PHP 5.5? Дайте нам знать об этом в комментариях.
Изображение через Fotolia