Re: __invoke() weirdness

From: Date: Mon, 29 Dec 2008 05:00:38 +0000
Subject: Re: __invoke() weirdness
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-42393@lists.php.net to get a copy of this message
On 25.12.2008, at 06:11, Lars Strojny wrote:
Hi David, Am Dienstag, den 23.12.2008, 17:02 +0100 schrieb David Zülke: [...]
This gives a fatal "Call to undefined method DateTime::getAtom()" $d = new DateTime(); $d->getAtom = Curry::create(array($d, 'format'), DATE_ATOM); echo $d->getAtom();
This is the same as the following: $obj = new stdClass(); $obj->method = function() { return "foo"; }; $obj->method(); The first "method" is a property, the call to "method" is - well - a method call. Because PHP separates methods and properties in the class entry structure - and because we have magic methods like __set, __get and __call, there is no efficient and logical way how to search for properties with closure instances when a method is not found. We discussed that before and decided to let closures go out into the wild and think about adding a solution for prototype alike inheritance later.
I realize that, but I guess it's pretty inconsistent, as I can do - $func(); - $func->__invoke(); - $obj->func->__invoke(); but not - $obj->func(); That was my point; I'm aware of potential reasons for this behavior (like what Stas pointed out). Sorry for the confusion ;) Is it going to be like this forever? Stas said "there is no way to distinguish". Isn't that a parser issue that should be gone now with the switch to re2c? Wouldn't it be possible to just do a lookup for a property that is an object with __invoke if the method was not found? - David

« previous php.internals (#42393) next »