Property Hooks приближаются к реализации в PHP 8.4

Источник: «Property Hooks Get Closer to Becoming a Reality in PHP 8.4»
Property Hooks в PHP становится всё ближе к появлению в PHP 8.4 благодаря подавляющему большинству голосов 34/1. Узнайте о Property Hooks в PHP и синтаксисе, описанном в предложении.

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, если вы хотите увидеть обсуждение и прогресс этой функции.

Дополнительные материалы

Предыдущая Статья

Селекторы атрибутов в CSS

Следующая Статья

Создание собственных PHP хелперов в Laravel проекте