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
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to