Migrating from PHP 7.0.x to PHP 7.1.x
PHP Manual

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

Обнуляемые типы

Типы для параметров и возвращаемых значений могут быть помечены как обнуляемые, путем добавления префикса в виде знака вопроса. Это означает, что указанные параметры и возвращаемые значения, могут быть как указанного типа, так и null.

<?php

function testReturn(): ?string
{
    return 
'elePHPant';
}

var_dump(testReturn());

function 
testReturn(): ?string
{
    return 
null;
}

var_dump(testReturn());

function 
test(?string $name)
{
    
var_dump($name);
}

test('elePHPant');
test(null);
test();

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

string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

Ничего не возвращающие функции

Был добавлени тип возвращаемого значения void. Функции с таким заданным типом возвращаемого значения не должны ничего возвращать. То есть либо вообще не содержать ни одного оператора return, либо использовать его без параметра. null не является корректным значением для возврата в таких функциях.

<?php
function swap(&$left, &$right) : void
{
    if (
$left === $right) {
        return;
    }

    
$tmp $left;
    
$left $right;
    
$right $tmp;
}

$a 1;
$b 2;
var_dump(swap($a$b), $a$b);

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

null
int(2)
int(1)

Попытка использовать возвращаемое значение таких функций приведет к тому, что это значение будет считаться за null, без вывода предупреждения. Причина этого в том, что предупреждения будут вызывать общих функций высшего порядка.

Симметричная деструктуризация массива

Можно использовать короткий синтаксис ([]) для деструктуризации массивов с целью присвоения (в том числе в foreach), как альтернатива функции list(), которая, впрочем, все еще поддерживается.

<?php
$data 
= [
    [
1'Tom'],
    [
2'Fred'],
];

// list() style
list($id1$name1) = $data[0];

// [] style
[$id1$name1] = $data[0];

// list() style
foreach ($data as list($id$name)) {
    
// logic here with $id and $name
}

// [] style
foreach ($data as [$id$name]) {
    
// logic here with $id and $name
}

Видимость констант класса

Добавлена поддержка задания области видимости для констант класса.

<?php
class ConstDemo
{
    const 
PUBLIC_CONST_A 1;
    public const 
PUBLIC_CONST_B 2;
    protected const 
PROTECTED_CONST 3;
    private const 
PRIVATE_CONST 4;
}

Псевдо-тип iterable

Был добавлен новый псевдо-тип (похожий на callable), названный iterable. Он может использоваться как параметр, так и в качестве возвращаемого значения там, где используется массив или объект реализующий интерфейс Traversable. Что касается подтипов, типы параметров из дочерних классов могут расширить декларацию родителей типа array или Traversable до iterable. Для типов возврата, дочерние классы могут сужать тип возвращаемого значения с iterable до array или объекта реализующего Traversable.

<?php
function iterator(iterable $iter)
{
    foreach (
$iter as $val) {
        
//
    
}
}

Обработка нескольких исключений в одном блоке catch

В блоке catch теперь можно обрабатывать несколько исключений, перечисляя их через символ вертикальной черты (|). Это может быть полезно, если различные исключения обрабатываются одинаково.

<?php
try {
    
// Какой то код
} catch (FirstException SecondException $e) {
    
// Обрабатываем оба исключения
}

Поддержка ключей в list()

Теперь вы можете указывать ключи в операторе list(), или в его новом, коротком, синтаксисе []. Это позволяет дестриктурировать массивы с нечисловыми или непоследовательными ключами.

<?php
$data 
= [
    [
"id" => 1"name" => 'Tom'],
    [
"id" => 2"name" => 'Fred'],
];

// стиль list()
list("id" => $id1"name" => $name1) = $data[0];

// стиль []
["id" => $id1"name" => $name1] = $data[0];

// стиль list()
foreach ($data as list("id" => $id"name" => $name)) {
    
// logic here with $id and $name
}

// стиль []
foreach ($data as ["id" => $id"name" => $name]) {
    
// logic here with $id and $name
}

Поддержка отрицательных смещений для строк

Поддержка отрицательных смещений для строк добавлена в функции манипуляции строками, также как в индексации строк с помощью [] или {}. В этих случаях, отрицательные смещения интерпритируются как смещения относительно конца строки.

<?php
var_dump
("abcdef"[-2]);
var_dump(strpos("aabbcc""b", -3));

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

string (1) "e"
int(3)

Теперь поддерживаются отрицательные смещения в простом синтаксисе указания индекса в строках и массивах.

<?php
$string 
'bar';
echo 
"The last character of '$string' is '$string[-1]'.\n";
?>

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

The last character of 'bar' is 'r'.

Поддержка AEAD в ext/openssl

Поддержка AEAD (режимы GCM и CCM) была добавлена путем расширения функций openssl_encrypt() и openssl_decrypt() дополнительными параметрами.

Преобразование callable в Closure с помощью Closure::fromCallable()

Новый статический метод добавлен в класс Closure для возможности легко преобразовать callable в объекты типа Closure.

<?php
class Test
{
    public function 
exposeFunction()
    {
        return 
Closure::fromCallable([$this'privateFunction']);
    }

    private function 
privateFunction($param)
    {
        
var_dump($param);
    }
}

$privFunc = (new Test)->exposeFunction();
$privFunc('some value');

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

string(10) "some value"

Асинхронная обработка сигналов

Новая функция pcntl_async_signals() была добавлена для разрешения асинхронной обработки сигналов без использования тиков (которые производят много накладных расходов).

<?php
pcntl_async_signals
(true); // включает асинхронные сигналы

pcntl_signal(SIGHUP,  function($sig) {
    echo 
"SIGHUP\n";
});

posix_kill(posix_getpid(), SIGHUP);

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

SIGHUP

Поддержка HTTP/2 server push в ext/curl

Поддержка "server push" добавлена в расширение CURL (требуется версия 7.46 и выше). Использовать можно в функции curl_multi_setopt() с новой константой CURLMOPT_PUSHFUNCTION. Также добавлены константы CURL_PUSH_OK и CURL_PUSH_DENY, для определения, был ли прнинят или отклонен "server push".


Migrating from PHP 7.0.x to PHP 7.1.x
PHP Manual