ScotlandPHP

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

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

Была добавлена поддержка генераторов использующих ключевое слово 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 extension. 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
135
emanwebdev at gmail dot com
3 years ago
Thank You for making empty() to support arbitrary expressions!
up
53
yannicschne at gmail dot com
3 years ago
The array and string dereferencing is awesome! Thanks for this.
up
18
mykolas dot sirius at gmail dot com
3 years ago
Finally, array and string literal dereferencing is here, bless you all!
up
6
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
14
PHP Guy
3 years ago
Great work.  Thank you for allowing Lists to return on foreach.
up
9
Love this
3 years ago
Thanks for making "empty" easier to use and for the array dereferencing!!
up
2
Anonymous
2 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
-2
k-gun @ github
1 year ago
Array dereferencing with defaults for possibly empty sources;

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