<?php
function swap( &$a, &$b ): void
{ [ $a, $b ] = [ $b, $a ]; }
?>
Типы для параметров и возвращаемых значений могут быть помечены как
обнуляемые путём добавления префикса в виде знака вопроса.
Это означает, что указанные параметры и возвращаемые значения, могут
быть как указанного типа, так и 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()
list($id1, $name1) = $data[0];
// используя []
[$id1, $name1] = $data[0];
// используя list()
foreach ($data as list($id, $name)) {
// код, содержащий $id и $name
}
// используя []
foreach ($data as [$id, $name]) {
// код, содержащий $id и $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;
}
Был добавлен новый псевдотип (похожий на callable), названный iterable. Он может использоваться как параметр, так и в качестве возвращаемого значения там, где используется массив или объект, реализующий интерфейс Traversable. Что касается подтипов, типы параметров из дочерних классов могут расширить декларацию родителей типа array или Traversable до iterable. Для типов возврата, дочерние классы могут сужать тип возвращаемого значения с iterable до array или объекта реализующего Traversable.
<?php
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}
В блоке catch теперь можно обрабатывать несколько исключений, перечисляя их
через символ вертикальной черты (|
). Это может быть полезно,
если различные исключения обрабатываются одинаково.
<?php
try {
// Какой то код
} catch (FirstException | SecondException $e) {
// Обрабатываем оба исключения
}
Теперь вы можете указывать ключи в операторе 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 "Последний символ '$string' - '$string[-1]'.\n";
?>
Результат выполнения приведённого примера:
Последний символ 'bar' - 'r'.
Поддержка AEAD (режимы GCM и CCM) была добавлена путём расширения функций openssl_encrypt() и openssl_decrypt() дополнительными параметрами.
В класс 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('значение');
Результат выполнения приведённого примера:
string(16) "значение"
Новая функция pcntl_async_signals() была добавлена для разрешения асинхронной обработки сигналов без использования тиков (которые производят много накладных расходов).
<?php
pcntl_async_signals(true); // включает асинхронные сигналы
pcntl_signal(SIGHUP, function($sig) {
echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);
Результат выполнения приведённого примера:
SIGHUP
Поддержка "server push" добавлена в модуль CURL (требуется версия 7.46 и выше).
Использовать можно в функции curl_multi_setopt() с новой
константой CURLMOPT_PUSHFUNCTION
. Также добавлены константы
CURL_PUSH_OK
и CURL_PUSH_DENY
для
определения, был ли принят или отклонён "server push".
Была добавлена опция контекста потока tcp_nodelay.
Note that declaring nullable return type does not mean that you can skip return statement at all. For example:
php > function a(): ?string { }
php > a();
PHP Warning: Uncaught TypeError: Return value of a() must be of the type string or null, none returned in php shell code:2
php > function b(): ?string { return; }
PHP Fatal error: A function with return type must return a value (did you mean "return null;" instead of "return;"?) in php shell code on line 2