Несколько типов для параметра/свойства/возврата:
function getId(): int|string { ... }
function setItems(array|int $ids): void { ... }
→ |null можно не писать — ?T по-прежнему работает.
Вызов функции по именам параметров:
array_fill(start_index: 5, num: 3, value: 'x');
// вместо: array_fill(5, 3, 'x');
function division($x, $y): float
{ return $x / $y;}
echo division(y: 5,x: 10);
→ Порядок не важен. Пропущенные — берут значения по умолчанию.
🧩 Match expression
Безопасная замена switch:
$result = match($status) {
200, 300 => 'ok',
404 => 'not found',
default => 'unknown',
};
echo match($color){ 'res' => 'красный', 'yellow' => 'желтый', 'green' => 'зеленый', };
→ Возвращает значение,
→ strict comparison (===),
→ все ветки должны возвращать совместимый тип,
→ default обязателен, если не покрыты все варианты.
class Person
{
public function __construct ( public string $name, protected int $age ){}
}
Атрибуты, метаданные, который можно добавить к классам, методам, свойствам, аргументам, контекстам.
Доступ к ним можно получить с помощью рефлексии:
#[Route('/api/users')]
class UserController { ... }
#[\SensitiveParameter]
function login(string $user, string $password) { ... }
#[Attribute]
class SomeAttr{}
class Foo{
#[SomeAttr]
public function execute(){...}}
$foo = new Foo();
$reflection = new ReflectionMethod($foo, 'execute');
$attributes = $reflection->getAttributes(SomeAttr::class);
→ Замена docblock-аннотациям (@Route), проверяется на этапе компиляции.
— JIT (Just-In-Time компиляция) Как исполняется PHP в общем случае:
Исходный код программы обрабатывается парсером, строится абстрактное синтаксическое дерево(AST) AST компилируется в байт-код для виртуальной машине Zend Engine Байт-код сохраняется в памяти(кэш опкодов) Выполняется внутри Zend Engine
— C JIT:
Исходный код программы обрабатывается парсером, строится абстрактное синтаксическое дерево(AST) AST компилируется в байт-код для виртуальной машине Zend Engine Байт-код сохраняется в памяти(кэш опкодов) Вместо выполнения байт-кода, он переводится в машинный кода Машинный код выполняется на процессоре
; php.ini
opcache.jit_buffer_size=100M
opcache.jit=1235
→ Эффект: +50% в математике, парсинге, компиляции регулярок.
→ Для typical LAMP-стека — прирост ~0–5%
⚠️ Breaking changes
str_contains(), str_starts_with(), str_ends_with() — новые функции (не breaking, но часто путают),
@ больше не гасит TypeError, ValueError, ArithmeticError,
create_function() — удалён (deprecated в 7.2),
real — удалён (был alias float).
Сохраняется контравариантность при наследовании аргументов(можно расширить тип), ковариантность у возвращаемых значений(можно сужать тип) Типы свойств при наследовании инвариантны(нельзя менять тип или далять)
return new static; ключевое слово static, обозначающее имя класса, в контексте которого выполняется статический метод, можно использовать как имя типа. Тип static можно указывать только у возвращаемого значения!