Состоялся релиз PHP 7.1.
Новые возможности
- Nullable типы;
- тип возвращаемого значения void;
- псевдотип iterable;
- модификаторы доступа для констант классов;
- короткий синтаксис для list() и возможность указывать ключи в list();
- обработка нескольких исключений сразу.
Nullable типы
Декларации типов параметров и возвращаемых значений теперь могут быть отмечены как nullable с помощью префикса ?
.
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();
/*
Output:
string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...
*/
Тип возвращаемого значения void
Функции с таким типом не должны ничего возвращать, а именно не должны содержать ни одного оператора return
либо использовать его без параметра. При использовании возвращаемого значения оно будет приведено к null
без предупреждения.
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);
/*
Output:
null
int(2)
int(1)
*/
Симметричная деструктуризация массивов
Добавлена поддержка короткого синтаксиса массивов ([]
) при их деструктуризации (в том числе и для foreach
) как альтернатива функции list()
.
$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
}
Поддержка ключей в list()
Теперь можно указывать ключи в функции list()
так же, как и в альтернативном варианте ([]
).
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
list("id" => $id1, "name" => $name1) = $data[0];
["id" => $id1, "name" => $name1] = $data[0];
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
}
Модификаторы доступа для констант класса
Добавлена поддержка задания области видимости для констант классов.
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
Iterable
Введён новый псевдотип iterable
.
Он может использоваться как в декларациях типов параметров, так и в качестве возвращаемого значения там, где используется массив или объект, реализующий интерфейс Traversable
.
<?php
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}
Обработка нескольких исключений одновременно
В блоке catch
теперь можно обрабатывать несколько исключений, перечисляя их через вертикальную черту (|
).
try {
// some code
} catch (FirstException | SecondException $e) {
// handle first and second exceptions
}
Поддержка отрицательных индексов для строк
При индексации строк с помощью []
или {}
стало возможным указание отрицательных индексов. Это изменение также распространяется на функции для работы со строками.
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
/*
Output:
string (1) "e"
int(3)
*/
Отрицательные индексы для строк и массивов теперь также поддерживаются и при интерполяции строк.
$string = 'bar';
echo "The last character of '$string' is '$string[-1]'.\n";
/*
Output:
The last character of 'bar' is 'r'.
*/
Преобразование callable в Closure с помощью Closure::fromCallable()
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
}
private function privateFunction($param)
{
var_dump($param);
}
}
$privFunc = (new Test)->exposeFunction();
$privFunc('some value');
/*
Output:
string(10) "some value"
*/
Асинхронная обработка сигналов
Новая функция pcntl_async_signals()
позволяет реализовать асинхронную обработку сигналов без использования тиков (производящих много накладных расходов).
pcntl_async_signals(true);
pcntl_signal(SIGHUP, function($sig) {
echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);
/*
Output:
SIGHUP
*/
Изменения, нарушающие обратную совместимость
- При передаче пользовательской функции недостаточного количества аргументов вместо предупреждения выбрасывается исключение.
void
иiterable
больше нельзя использовать в именах классов, интерфейсов и типажей.rand()
иsrand()
теперь являются синонимами дляmt_rand()
иmt_srand()
.- Символ удаления ASCII (
0x7F
) больше нельзя использовать в идентификаторах, не заключённых в кавычки. - Значение
error_log
изменено наsyslog
. - Следующие ini-директивы были удалены:
session.entropy_file
,session.entropy_length
,session.hash_function
,session.hash_bits_per_character
. - Сообщение для ошибок
E_RECOVERABLE
изменено с «Catchable fatal error» на «Recoverable fatal error».
Функциональность, объявленная устаревшей
- Расширение ext/mcrypt объявлено устаревшим и будет удалено из ядра в PHP 7.2. Вместо него предлагается использовать OpenSSL. Если это расширение всё же необходимо, его можно будет установить из PECL.
- Модификатор шаблона
e
для функцийmb_ereg_replace()
иmb_eregi_replace()
объявлен устаревшим.
>>> Руководство по миграции с 7.0.x на 7.1.x
>>> Исходный код
>>> Список изменений