В данной заметке собраны основные (не все, только основные) изменения в PHP 8-ой версии. Она будет постепенно обновляться. Первый релиз этой версии состоялся 20 ноября 2020 года – v8.0.0, а последний, на момент написания данной заметки, 4 февраля 2021 года – v8.0.2. Список релизов – php.net/releases/index.php.
Объединённые типы
Появилась возможность указывать несколько типов для одной переменной через логический оператор ИЛИ — «|». Пример:
<?php final class MyClass { private int|string $name; public function changeName(int|string $name):void { $this->name = $name; } public function showName() { var_dump($this->name); } } $object = new MyClass(); $object->changeName("Test name"); $object->showName(); // string(9) "Test name" $object->changeName(999); $object->showName(); // int(999)
Именованные аргументы
Появилась возможность указывать аргументы при вызове функций по их именам. Получается, теперь не обязательно указывать все возможные параметры, например, если нужен только первый и последний. Остальные параметры можно пропустить при условии наличия у них значений по умолчанию. Пример:
<?php function test($paramFirst, $paramSecond = null, $paramThird = null) { print_r($paramFirst); print_r($paramSecond); print_r($paramThird); } test('First param value', paramThird:"Third param value");
Объявление свойств в конструкторе
Поля класса теперь можно объявлять через конструктор. Пример:
<?php namespace PHP7; class User { public string $name; public string $surname; public function __construct( string $name = 'Ivan', string $surname = 'Ivanov' ) { $this->name = $name; $this->surname = $surname; } } print_r(new User()); namespace PHP8; class User { public function __construct( public string $name = 'Ivan', public string $surname = 'Ivanov' ) { } } print_r(new User());
Атрибуты
Атрибуты — это возможность добавлять метаданные к классам, методам, функциям, параметрам, свойствам и константам классов. Пример:
<?php namespace PHP7; class PostsController { /** * @Route("/api/posts/{id}", methods={"GET"}) */ public function get($id) { /* ... */ } } namespace PHP8; class PostsController { #[Route("/api/posts/{id}", methods: ["GET"])] public function get($id) { /* ... */ } }
Выражение Match
<?php namespace PHP7; $switchFlag = 1; switch ($switchFlag) { case 1: $result = 'Первый'; break; case 2: $result = 'Второй'; break; default: $result = 'Неизвестно'; } echo $result; namespace PHP8; $switchFlag = 1; echo match ($switchFlag) { 1 => 'Первый', 2 => 'Второй', default => 'Неизвестно', };
Оператор Nullsafe
Теперь к свойствам и методам можно также обращаться с помощью оператора «nullsafe»: ?->
. Оператор nullsafe работает так же, как доступ к свойству или методу, как указано выше, за исключением того, что если разыменование объекта выдаёт null
, то будет возвращён null
, а не выброшено исключение. Если разыменование является частью цепочки, остальная часть цепочки пропускается.
Аналогично заключению каждого обращения в is_null(), но более компактный.
<?php namespace PHP7; if (is_null($repository)) { $result = null; } else { $user = $repository->getUser(5); if (is_null($user)) { $result = null; } else { $result = $user->name; } } namespace PHP8; $result = $repository?->getUser(5)?->name;
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.