PHP 7.2.7 Released

Новые возможности

Добавлены генераторы

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

Простой пример реализации итератора из функции range() (по крайней мере, для положительных значений step):

<?php
function xrange($start$limit$step 1) {
    for (
$i $start$i <= $limit$i += $step) {
        
yield $i;
    }
}

echo 
'Нечетные числа меньше 10: ';

/*
 * Никакого массива создано и возвращено не будет,
 * все сохраняется в памяти.
 */
foreach (xrange(192) as $number) {
    echo 
"$number ";
}

echo 
"\n";
?>

Результат выполнения данного примера:

Нечетные числа меньше 10: 1 3 5 7 9 

Добавлено ключевое слово finally

Блоки try-catch теперь поддерживают блок finally, который будет выполнен в любом случае, было ли выброшено исключение или нет.

Новое API хеширования паролей

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

foreach теперь поддерживает list()

Цикл foreach теперь поддерживает распаковку вложенных массивов в отдельные переменные с помощью конструкции list(). К примеру:

<?php
$array 
= [
    [
12],
    [
34],
];

foreach (
$array as list($a$b)) {
    echo 
"A: $a; B: $b\n";
}
?>

Результат выполнения данного примера:

A: 1; B: 2
A: 3; B: 4

Более подробно это нововведение описано на странице посвященной foreach.

empty() поддерживает произвольные выражения

Реализована возможность передавать произвольные выражения в empty(). Пример:

<?php
function always_false() {
    return 
false;
}

if (empty(
always_false())) {
    echo 
"Это будет напечатано.\n";
}

if (empty(
true)) {
    echo 
"Это не будет напечатано.\n";
}
?>

Результат выполнения данного примера:

Это будет напечатано.

Литералы array и string разыменовываются

Литералы array и string теперь могут быть разыменованы напрямую для доступа к конкретным элементам и символам:

<?php
echo 'Разыменовывание массива: ';
echo [
123][0];
echo 
"\n";

echo 
'Разыменовывание строки: ';
echo 
'PHP'[0];
echo 
"\n";
?>

Результат выполнения данного примера:

Разыменовывание массива: 1
Разыменовывание строки: P

Разрешение имен класса с помощью ::class

Теперь можно использовать конструкцию ClassName::class для получения полностью определенного имени класса ClassName. К примеру:

<?php
namespace Name\Space;
class 
ClassName {}

echo 
ClassName::class;

echo 
"\n";
?>

Результат выполнения данного примера:

Name\Space\ClassName

Добавлено расширение OPcache

Был добавлен кеш байт-кода Zend Optimiser+ в новом расширении OPcache. OPcache увеличивает производительность PHP путем кеширования предварителльно скомпилированного байт-код скрипта в разделяемой памяти, что позволяет избежать загрузки и компиляции одних и тех же скриптов при каждом к ним обращении. Читайте инструкции по установке для более полной информации об установке и использовании OPcache.

foreach теперь поддерживает нескалярные ключи

foreach теперь поддерживает ключи любого типа. Так как не скалярные ключи не могут возникнуть в обычном массиве, эту функциональность можно использовать с методом Iterator::key(), который может вернуть значение любого типа. Теперь эти значения будут обрабатываться корректно.

Поддержка обработчика Apache 2.4 под Windows

SAPI обработчик Apache 2.4 теперь поддерживается в Windows.

Улучшения в GD

Несколько улучшений добавлено в расширение GD:

  • Поддержка зеркального отражения с помощью новой функции imageflip().
  • Продвинутые возможности обрезки с помощью новых функций imagecrop() и imagecropauto().
  • Поддержка чтения и записи WebP с помощью функций imagecreatefromwebp() и imagewebp() соответственно.
add a note add a note

User Contributed Notes 9 notes

up
144
emanwebdev at gmail dot com
4 years ago
Thank You for making empty() to support arbitrary expressions!
up
59
yannicschne at gmail dot com
4 years ago
The array and string dereferencing is awesome! Thanks for this.
up
15
mykolas dot sirius at gmail dot com
4 years ago
Finally, array and string literal dereferencing is here, bless you all!
up
9
Love this
4 years ago
Thanks for making "empty" easier to use and for the array dereferencing!!
up
13
PHP Guy
4 years ago
Great work.  Thank you for allowing Lists to return on foreach.
up
4
er dot ankitvishwakarma at gmail dot com
3 years ago
All the new features are incredible. I had always been waiting for such things to be happened.
up
1
Anonymous
3 years ago
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));
        }
    }
}
up
1
wallacemaxters at gmail dot com
1 year ago
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"
up
-6
k-gun @ github
2 years ago
Array dereferencing with defaults for possibly empty sources;

<?php
// string(4) "def2"
$x = ([] ?: ["def1", "def2"])[1];
?>
To Top