Developers often use methods to wrap and guard access to object properties. There are several highly common patterns for such logic, which in practice may be verbose to implement repeatedly. Alternatively, developers may use __get
and __set
to intercept reads and writes generically, but that is a sledge-hammer approach that intercepts all undefined (and some defined) properties unconditionally. Property hooks provide a more targeted, purpose-built tool for common property interactions.
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; } }
You can play around with them on 3v4l.org
This is good to have
i don't see any use case that can not be solved better with a value object.
i rather validate the whole object than properties by itself.
I want it!
good
Even though this is a nice syntax that we also know from other programming languages, I think it is problematic. The reason for this lies in the ambiguity: How does the developer know whether $entity->setSlug() = '...'
does something different than $entity->slug
?
Without property hooks the case is quite clear: the setter method could still contain some "under-the-hood" steps (such as validation), while directly changing the property sets the value "unfiltered". It should stay that way.
I like the idea - getting away from the mess that __get
and __set
can introduce is a great goal, but this example is confusing and appears to be incomplete. I checked the RFC for more details, and the number of different forms this could take just made me even more confused. Why do we need multiple variants and combinations of shorthand and magic variables, when it's ultimately just defining a special use case function? I'd be much happier with a simple keyword added to a normal function definition to denote it's purpose.
OK
This is one of the reasons why I love C#. Would be a nice addition in PHP!
Nice to have!
We already have this kind of properties in C#!
It simplifies dedicated logic for setters/getters, without having to mess directly with __get()
and __set()
.
This would be a very interesting way to ensure values of an property.
This seems a really nice addition! Love it!
This is long overdue.
Chain method on newly created objects without parentheses
Interface Default Methods improves backwards compatibility when changing interfaces, but also add a way to have multi-inheritance in PHP.
The "pipe operator" |>
allows you to chain multiple function calls in a more convenient way.