Property Hooks приближаются к реализации в PHP 8.4
RFC Property Hooks прошёл важную веху, получив 34 голоса "за" и только 1 голос "против". Это намного выше требуемого большинства в 2/3 голосов, необходимого для принятия решения.
Что такое property hooks в PHP?
Вот краткое описание предложения из RFC:
Разработчики часто используют методы для обёртывания и защиты доступа к свойствам объектов. Существует несколько распространённых паттернов для такой логики, которые на практике могут быть многословными для повторяющейся реализации. В качестве альтернативы разработчики могут использовать
__get
и__set
для общего перехвата чтения и записи, но это подход «кувалды», безоговорочно перехватывающий все неопределённые (и некоторые определённые) свойства. Property hooks предоставляют более целенаправленный, специально разработанный инструмент для взаимодействия с общими свойствами...Этот RFC вводит два «хука» для переопределения стандартного поведения свойства «get» и «set». Хотя они не включены в первоначальную версию, дизайн предусматривает возможность поддержки большего количества хуков в будущем.
Property hooks в PHP вдохновлены такими языками, как Kotlin, C# и Swift, а синтаксис включает два варианта, напоминающие сокращённые и многострочные замыкания:
class User implements Named
{
private bool $isModified = false;
public function __construct(
private string $first,
private string $last
) {}
public string $fullName {
// Переопределение действия "чтения"
get => $this->first . " " . $this->last;
// Переопределение действия "записи"
set {
[$this->first, $this->last] = explode(' ', $value, 2);
$this->isModified = true;
}
}
}
Синтаксис не требует обязательного определения обоих хуков; вот пример определения только set
из RFC:
class User
{
public string $name {
set {
if (strlen($value) === 0) {
throw new ValueError("Name must be non-empty");
}
$this->name = $value;
}
}
public function __construct(string $name) {
$this->name = $name;
}
}
Подробности о Property Hooks в PHP можно прочитать в RFC. Скорее всего, эта возможность появится в PHP 8.4. Реализация уже представлена в черновике pull request, если вы хотите увидеть обсуждение и прогресс этой функции.