Вышла стабильная версия PHP 8, бинарные файлы, в том числе для Windows, уже доступны для скачивания.
Бинарные файлы для Windows: https://windows.php.net/download
Что нового в PHP 8
Выпуск содержит крупные изменения в языке PHP, рассмотрим их.
PHP 8.0 содержит множество улучшений и новых функций, таких как:
- Типы Union
- Именованные аргументы
- Выражения match
- Атрибуты
- Constructor Property Promotion
- Оператор Nullsafe
- Weak Maps
- Just In Time Compilation
- И многое другое...
Именованные аргументы
PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
PHP 8
htmlspecialchars($string, double_encode: false);
Указывайте только обязательные параметры, пропуская необязательные.
Аргументы не зависят от порядка и самодокументированы.
Атрибуты
PHP 7
class PostsController { /** * @Route("/api/posts/{id}", methods={"GET"}) */ public function get($id) { /* ... */ } }
PHP 8
class PostsController { #[Route("/api/posts/{id}", methods: ["GET"])] public function get($id) { /* ... */ } }
Вместо аннотаций PHPDoc теперь вы можете использовать структурированные метаданные с собственным синтаксисом PHP.
Продвижение свойств конструктора RFC Doc
PHP 7
class Point { public float $x; public float $y; public float $z; public function __construct( float $x = 0.0, float $y = 0.0, float $z = 0.0, ) { $this->x = $x; $this->y = $y; $this->z = $z; } }
PHP 8
class Point { public function __construct( public float $x = 0.0, public float $y = 0.0, public float $z = 0.0, ) {} }
Меньше шаблонного кода для определения и инициализации свойств.
Типы Union RFC Doc
PHP 7
class Number { /** @var int|float */ private $number; /** * @param float|int $number */ public function __construct($number) { $this->number = $number; } } new Number('NaN'); // Ok
PHP 8
class Number { public function __construct( private int|float $number ) {} } new Number('NaN'); // TypeError
Вместо аннотаций PHPDoc для комбинации типов вы можете использовать собственные объявления типа union, которые проверяются во время выполнения.
Выражения match RFC Doc
PHP 7
switch (8.0) { case '8.0': $result = "Oh no!"; break; case 8.0: $result = "This is what I expected"; break; } echo $result; //> Oh no!
PHP 8
echo match (8.0) { '8.0' => "Oh no!", 8.0 => "This is what I expected", }; //> This is what I expected
Новый match похож на switch и имеет следующие особенности:
- match — это выражение, то есть его результат может быть сохранен в переменной или возвращён.
- Ветви соответствия поддерживают только однострочные выражения и не требуют указания break;
- match делает строгие сравнения.
Оператор Nullsafe RFC
PHP 7
$country = null; if ($session !== null) { $user = $session->user; if ($user !== null) { $address = $user->getAddress(); if ($address !== null) { $country = $address->country; } } }
PHP 8
$country = $session?->user?->getAddress()?->country;
Вместо нулевых (null) условий проверки теперь вы можете использовать цепочку вызовов с новым nullsafe оператором. Когда оценка одного элемента в цепочке завершается неудачно, выполнение всей цепочки прерывается, и вся цепочка принимает значение null.
Более разумное сравнение строки и числа RFC
PHP 7
0 == 'foobar' // true
PHP 8
0 == 'foobar' // false
При сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае он преобразует число в строку и использует сравнение строк.
Ошибки согласованного типа для внутренних функций RFC
PHP 7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
PHP 8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
Большинство внутренних функций теперь выдают исключение Error, если проверка параметров не выполняется.
Компиляция Just-In-Time
PHP 8 представляет два механизма JIT-компиляции. Tracing JIT, наиболее многообещающая из двух, показывает примерно в 3 раза лучшую производительность на синтетических тестах и в 1,5–2 раза на некоторых конкретных долго работающих приложениях. Типичная производительность приложения на уровне PHP 7.4.
Сравнение производительности JIT в PHP 8
Улучшения в системе типов и обработке ошибок
- Более строгие проверки типов для арифметических/побитовых операторов RFC
- Проверка метода абстрактных признаков RFC
- Правильные сигнатуры магических методов RFC
- Реклассифицированные предупреждения движка RFC
- Фатальная ошибка для несовместимых сигнатур методов RFC
- Оператор @ больше не отключает фатальные ошибки.
- Наследование частными методами RFC
- Смешанный тип RFC
- Статический тип возврата RFC
- Типы для внутренних функций Email thread
- Непрозрачные объекты вместо ресурсов для расширений Curl, Gd, Sockets, OpenSSL, XMLWriter и XML
Прочие настройки и улучшения синтаксиса
- Разрешить конечную запятую в списках параметров RFC и конечную запятую в списках RFC
- Разрешить перехват исключений без перехвата их в переменные RFC
- Изменения синтаксиса переменных RFC
- Рассматривать имена в пространстве имён как один токен RFC
- Throw теперь выражение RFC
- Разрешить ::class для объектов RFC
Новые классы, интерфейсы и функции
- Класс Weak Map
- Интерфейс Stringable
- str_contains(), str_starts_with(), str_ends_with()
- fdiv()
- get_debug_type()
- get_resource_id()
- Реализация объекта token_get_all()
Дополнительная информация
- Список изменений в PHP 8.0.0
- Полный список новых возможностей PHP 8
- Обратно несовместимые изменения PHP 8
- Устаревшие возможности PHP 8
- Другие изменения PHP 8
Связанные статьи:
- Как в PHP 8 показать все ошибки (69.5%)
- Как получить последний элемент массива в PHP (57.5%)
- Как получить User Agent в PHP. Как настроить browscap.ini (55.4%)
- Как увеличить память и время для PHP скриптов (55.4%)
- Почему не работает код в <? и ?>. Как включить поддержку сокращённых тегов в PHP. Что означает <?= (55.4%)
- Как получить бесплатный SSL сертификат COMODO (RANDOM - 12%)