Что нового в PHP 8

В данной заметке собраны основные (не все, только основные) изменения в 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;

Полезные ссылки

10.12.2020

Категория(-и): PHP

#

Добавить комментарий