Таким образом, когда свойству присвоено значение $name, будет вызван хук set, и значение будет проверено перед его установкой.
$user = new User();
$user->name = 'Ser'; // Должно вывести исключение InvalidArgumentException
$user = new User();
$user->name = 'Sergey';
echo $user->name; // Sergey
Существует также сокращенный синтаксис для определения хука set с помощью оператора =>, похожий на замыкания:
class User
{
public string $name {
set => strtoupper($value);
}
}
Хук get позволяет вам определить собственную логику для доступа к свойствам. Это может быть полезно для свойств, которые необходимо изменить, прежде чем они будут возвращены пользователю.
Например, если в классе User есть два свойства $name и $lastName, мы можем определить get для свойства $fullName следующим образом:
class User
{
public function __construct(
public string $name, public string $lastName
) {}
public string $fullName {
get {
return $this->name . " " . $this->lastName;
}
}
}
$user = new User('Sergey', 'Mukhin');
echo $user->fullName; // Sergey Mukhin
Как вы можете заметить, хук get не принимает никаких аргументов. Он просто возвращает значение свойства. Как и обычный геттер.
Таким образом, при доступе к значению $fullName будет вызван хук get, и значение будет возвращено на основе логики, определенной в хуке.
Так же существует сокращенный синтаксис для хука get с помощью оператора =>
class User
{
public function __construct(
public string $name,
public string $lastName
) {}
public string $fullName {
get => string $this->name . " " . $this->lastName;
}
}
Итак, что в заключении, хуки свойств - это мощная функция, позволяющая настраивать поведение свойств более понятным, кратким и гибким способом, чем другие подходы. Они особенно полезны, когда вы хотите добавить пользовательскую логику к свойствам, которые читаются или записываются объектом.
В RFC упоминается, что, хотя в настоящее время существует два хука свойств, в будущем есть возможность добавить больше, что сделает работу со свойствами еще более мощной.
Можно только поблагодарить Илью Товило и Ларри Гарфилда, в очередной раз создавших столь прекрасный функционал!
https://sergeymukhin.com/blog/php-84-property-hooks