Oops, didn't tag the subject.
On Sat, Mar 13, 2021 at 4:51 PM David Gebler <davidgebler@gmail.com> wrote:
> With the introduction of attributes in PHP 8, this new behaviour is still> quite sparsely documented. Some of the articles I've seen out there,> though, liken PHP's attributes to similar constructs in other languages> including decorators in Python.>> Attributes are not the same thing as (Python's concept of) decorators and> they shouldn't be confused; a decorator is a function which wraps another> function and is automatically called in place of the wrapped function.>> This isn't currently possible in PHP. Using frameworks like Symfony, we> can start to build things like this:>> class UserProfileController {> #[LoginRequired]> public function editProfile(...) { }> }>> but the logic of enforcing our "require the user to be logged in"> decorator relies on the surrounding framework controlling the flow of> execution, reading the attribute and deciding whether to call the decorated> method editProfile() at all.>> What we *can't* do is something like this:>> class Foo {> private function timer(callable $wrapped)> {> $start = microtime(true);> $wrapped();> $end = microtime(true);> $total = $end - $start;> echo "Executed function in $total second(s)\n";> }>> #[timer]> public function bar($a, $b) { ... }>> #[timer]> public function baz($a, $b) { ... }> }>> What I'm wondering is whether there's a desire / interest for a built-in> attribute to provide this kind of behaviour modification.>> I'm thinking something like>> class Foo {> private function timer(callable $wrapped) { ... }>> #[Decorator([self::class, 'timer'])]> public function bar() {> echo "Bar";> }> }>> Where this would result in any call to $foo->bar() being equivalent to as> if the above were defined as:>> class Foo {> private function timer(callable $wrapped) { ... }>> public function __bar() {> echo "Bar";> }>> public function bar() {> return $this->timer([$this, '__bar']);> }> }>> I'm not saying I have the skills to implement this attribute (though I'd> happily try), I'm not even in a position to propose a draft RFC at this> stage, just throwing the idea out there to get a feel for what people think> of the concept?>> Regards,> Dave>