Property hooks (PHP 8.4) дозволяють прив'язати логіку до читання й запису властивості - без геттерів і сеттерів і без магічних __get/__set.
final class User
{
public string $email {
set (string $value) {
if (! filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Некоректний email');
}
$this->email = mb_strtolower($value);
}
}
public string $displayName {
get => trim("{$this->firstName} {$this->lastName}"); // віртуальна властивість
}
public function __construct(public string $firstName, public string $lastName, string $email)
{
$this->email = $email;
}
}
$user->email = 'Olia@Example.com'; // спрацює set-хук
echo $user->displayName; // спрацює get-хук
Властивість, що має лише get-хук і не звертається до власного значення, - віртуальна: місця для неї не виділяється.
Асиметрична видимість - різні модифікатори для читання й запису:
final class Order
{
public private(set) string $status = 'new'; // читати - всім, змінювати - лише класу
public function ship(): void
{
$this->status = 'shipped';
}
}
Скорочення: private(set) string $status означає public private(set).
Що це змінює:
- Публічна властивість більше не означає «будь-хто може записати що завгодно» - валідацію й нормалізацію можна додати пізніше, не змінюючи API на методи.
- Відпадає шаблонний код геттерів для «читається всім, змінюється лише всередині».
- Хуки можна оголошувати в інтерфейсах:
public string $name { get; }.
Обмеження: хуки й readonly не поєднуються, а посилання на властивість з set-хуком (&$obj->prop) заборонене.