PHP Velho Oeste 2024

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

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

Была добавлена поддержка генераторов через ключевое слово 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().
add a note add a note

User Contributed Notes 3 notes

up
13
PHP Guy
10 years ago
Great work.  Thank you for allowing Lists to return on foreach.
up
1
Anonymous
9 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
0
wallacemaxters at gmail dot com
7 years 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"
To Top