Типы для параметров и возвращаемых значений могут быть помечены как обнуляемые, путем добавления префикса в виде знака вопроса. Это означает, что указанные параметры и возвращаемые значения, могут быть как указанного типа, так и 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;
}
Был добавлен новый псевдо-тип (похожий на 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 "The last character of '$string' is '$string[-1]'.\n";
?>
Результат выполнения данного примера:
The last character of 'bar' is '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('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
Поддержка "server push" добавлена в расширение CURL (требуется версия 7.46 и выше).
Использовать можно в функции curl_multi_setopt() с новой
константой CURLMOPT_PUSHFUNCTION
. Также добавлены константы
CURL_PUSH_OK
и CURL_PUSH_DENY
, для
определения, был ли прнинят или отклонен "server push".