PHP 8.0 (26.11.2020)

Объединенный типы

🎯 Union types

Несколько типов для параметра/свойства/возврата:

				
					function getId(): int|string { ... }
function setItems(array|int $ids): void { ... }
				
			

→ |null можно не писать — ?T по-прежнему работает.

 

Именованные аргументы ф-ций

🧪 Named arguments

Вызов функции по именам параметров:

				
					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(предназначенный для выбора одного из нескольких значений):

🧩 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 ){} 
}
				
			

Атрибуты

🏷️ Attributes (аннотации)

Атрибуты, метаданные, который можно добавить к классам, методам, свойствам, аргументам, контекстам.

Доступ к ним можно получить с помощью рефлексии:

				
					#[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 компиляция)

🚀 JIT (Just-In-Time)

— 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 можно указывать только у возвращаемого значения!