Hello Lars,

Wednesday, December 31, 2008, 6:59:08 PM, you wrote:

> Hi Markus,

> have you measured the performance impact in a class with - say - ten
> methods? And what to do with __get() and __call()? How are the
> prioritized in the method resolve order?

Translated into user code we now have:

public function __zend_call($name, $args) {
  // Added property lookup
  if (isset($this->$name)) {    // may call __isset
    $callable = $this->$name;   // may call __get
    if (is_callable($callable)) {
      return call_user_func_array($callable, $args);
    }
  }
  // Original behavior:
  // Check for __call
  if (method_exists($this, '__call')) {
    return $this->__call($name, $args);
  }
  // error
  error_log('Function ' . __CLASS__ . '::' . $name . ' not found');
  return NULL;
}

As to the performance impact. We add one additional hash-lookup per
method call on a default class for a non found function. So whenever
we would normally call __call we add an additional lookup.

> cu, Lars

> Am Mittwoch, den 31.12.2008, 17:38 +0100 schrieb Marcus Boerger:
>> Hello David,
>> 
>> Tuesday, December 23, 2008, 5:02:43 PM, you wrote:
>> 
>> > Hi folks,
>> 
>> > I played with __invoke today:
>> 
>> > class Curry
>> > {
>> >    protected $callable;
>> >    protected $args;
>> 
>> >    public static function create($callable)
>> >    {
>> >      $curry = new self($callable, array_slice(func_get_args(), 1));
>> >      return $curry;
>> >    }
>> 
>> >    protected function __construct($callable, $args)
>> >    {
>> >      $this->callable = $callable;
>> >      $this->args = $args;
>> >    }
>> 
>> >    public function __invoke()
>> >    {
>> >      return call_user_func_array($this->callable, array_merge($this- 
>>  >>args, func_get_args()));
>> >    }
>> > }
>> 
>> > However, it doesn't work consistently.
>> 
>> > This works fine:
>> >    $d = new DateTime();
>> >    $getAtom = Curry::create(array($d, 'format'), DATE_ATOM);
>> >    echo $getAtom();
>> 
>> > 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();
>> 
>> > Is that intentional?
>> 
>> So far it is. Yet I as much as you do not like the inconsistency. So I
>> spend a little bit on providing the following patch that should do what
>> you were looking for.
>> 
>> The disadvantage: Calling properties is case sensitive while calling
>> methods isn't. But since this has nothign to do with this patch and the
>> patch only increases consistency I am all for applying it.
>> 
>> Comments? Lukas/Johannes?
>> 
>> Oh I hate that case insensitivity.... and inconsistency....
>> 
>> > Cheers,
>> 
>> > David
>> 
>> 
>> 
>> 
>> 
>> Best regards,
>>  Marcus
>> -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, 
>> visit: http://www.php.net/unsub.php




Best regards,
 Marcus


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to