Great work. Thank you for allowing Lists to return on foreach.
Была добавлена поддержка генераторов через ключевое слово yield. Генераторы предоставляют простое решение для реализации простых итераторов без накладных расходов или сложности создания полноценного класса, реализующего интерфейс Iterator.
Простой пример реализации итератора из функции
range() (по крайней мере, для
положительных значений step
):
<?php
function xrange($start, $limit, $step = 1) {
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
}
echo 'Нечетные числа меньше 10: ';
/*
* Никакого массива создано и возвращено не будет,
* все сохраняется в памяти.
*/
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";
?>
Результат выполнения данного примера:
Нечетные числа меньше 10: 1 3 5 7 9
finally
Блоки try
-catch
теперь поддерживают блок finally
,
который будет выполнен в любом случае, было ли выброшено
исключение или нет.
Новое API хеширования паролей позволяет более просто создавать и управлять безопасными хешами паролей и базируется на той же библиотеке, что и функция crypt(). Подробности можно узнать в документации к функции password_hash().
foreach
теперь поддерживает list()Цикл foreach теперь поддерживает распаковку вложенных массивов в отдельные переменные с помощью конструкции list(). К примеру:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
echo "A: $a; B: $b\n";
}
?>
Результат выполнения данного примера:
A: 1; B: 2 A: 3; B: 4
Более подробно это нововведение описано на странице посвященной foreach.
Реализована возможность передавать произвольные выражения в empty(). Пример:
<?php
function always_false() {
return false;
}
if (empty(always_false())) {
echo "Это будет напечатано.\n";
}
if (empty(true)) {
echo "Это не будет напечатано.\n";
}
?>
Результат выполнения данного примера:
Это будет напечатано.
Литералы array и string теперь могут быть разыменованы напрямую для доступа к конкретным элементам и символам:
<?php
echo 'Разыменовывание массива: ';
echo [1, 2, 3][0];
echo "\n";
echo 'Разыменовывание строки: ';
echo 'PHP'[0];
echo "\n";
?>
Результат выполнения данного примера:
Разыменовывание массива: 1 Разыменовывание строки: P
Теперь можно использовать конструкцию
ClassName::class
для получения полностью
определенного имени класса ClassName
.
К примеру:
<?php
namespace Name\Space;
class ClassName {}
echo ClassName::class;
echo "\n";
?>
Результат выполнения данного примера:
Name\Space\ClassName
Был добавлен кеш байт-кода Zend Optimiser+ в новом расширении OPcache. OPcache увеличивает производительность PHP путем кеширования предварителльно скомпилированного байт-код скрипта в разделяемой памяти, что позволяет избежать загрузки и компиляции одних и тех же скриптов при каждом к ним обращении. Читайте инструкции по установке для более полной информации об установке и использовании OPcache.
foreach
теперь поддерживает нескалярные ключиforeach теперь поддерживает ключи любого типа. Так как не скалярные ключи не могут возникнуть в обычном массиве, эту функциональность можно использовать с методом Iterator::key(), который может вернуть значение любого типа. Теперь эти значения будут обрабатываться корректно.
SAPI обработчик Apache 2.4 теперь поддерживается в Windows.
Несколько улучшений добавлено в расширение GD:
Yield is awesome... it's starts to look like a real language now ;-)
class myList {
public $list;
public function __construct($list) {
$this->list = $list;
}
public function select(...$keys) {
$keys_array = array_fill_keys($keys, null);
$items = $this->list;
foreach($items as $item) {
yield array_merge($keys_array, array_intersect_key($item, $keys_array));
}
}
}
After PHP 5.5, foreach with reference in arbitrary array does not generate an error:
foreach ([1, 2, 3, 4] as $key => &$value) {
$value = $value . ' R$';
}
before 5.4, will generate "Cannot create references to elements of a temporary array expression"