Типізовані константи класу (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().