Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Middle PHP 8+

Що дають типізовані константи класу і атрибут #[\Override] у PHP 8.3?

Типізовані константи класу (PHP 8.3) - тип можна вказати й для константи:

interface HasVersion
{
    const string VERSION = '1.0';
}

class Api implements HasVersion
{
    const string VERSION = '2.0';   // ок
    // const VERSION = 2;           // помилка: константа має бути string
}

Раніше нащадок чи клас, що реалізує інтерфейс, міг перевизначити константу значенням будь-якого типу, і код, що на неї покладався, отримував сюрприз.

#[\Override] - позначає метод, який має перевизначати метод батьківського класу чи інтерфейсу. Якщо такого методу в предка немає, PHP видасть помилку:

class BaseController
{
    protected function authorizeRequest(): void {}
}

class UserController extends BaseController
{
    #[\Override]
    protected function authorizeRequest(): void {}   // ок

    #[\Override]
    protected function authoriseRequest(): void {}   // помилка: опечатка, нічого не перевизначено
}

Навіщо #[\Override]:

  • Ловить опечатки в назві перевизначеного методу - без атрибута такий метод просто ніколи не викликається фреймворком.
  • Ловить зміни в батьківському класі: якщо бібліотека перейменувала чи видалила метод, усі «перевизначення» в нащадках одразу дадуть помилку замість тихого мертвого коду.
  • Документує намір для читача.

Ще з PHP 8.3: json_validate() (перевірка без розбору всього документа в пам'ять), динамічне звернення до констант класу (Foo::{$name}), повторна ініціалізація readonly-властивостей у __clone, нові методи Random\Randomizer, mb_str_pad().

Докладніше в документації: Реліз PHP 8.3

1

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання