CakeFest 2024: The Official CakePHP Conference

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

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

Типы для параметров и возвращаемых значений могут быть помечены как обнуляемые путём добавления префикса в виде знака вопроса. Это означает, что указанные параметры и возвращаемые значения, могут быть как указанного типа, так и 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;
}

Псевдотип 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
"Последний символ '$string' - '$string[-1]'.\n";
?>

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

Последний символ 'bar' - '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('значение');

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

string(16) "значение"

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

Новая функция 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".

Контекстные опции потока

Была добавлена опция контекста потока tcp_nodelay.

add a note

User Contributed Notes 2 notes

up
75
DYM
5 years ago
<?php
function swap( &$a, &$b ): void
{ [ $a, $b ] = [ $b, $a ]; }
?>
up
26
unti1x
5 years ago
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
To Top