Hi Marcus,

I now have revised my patch to include your suggestions:

http://www.christian-seiler.de/temp/closures-php-5.3-2008-06-17-2.diff

The changes to the previous version:

 - \0 at the start of the compiled lambda function name is dropped.
 - lambdas which are class members are now marked as final
 - the generated name of the lambda is now also stored within the
   op_array (before op_array->function_name was simply "lambda")
 - your suggestions for code cleanups in zend_compile.c

Actually how does it integrate with reflection?

Consider the following class:

class Example {
  private $x = 0;

  public function getIncer () {
    return function () {
      $this->x++;
    };
  }

  public function show () {
    $this->reallyShow ();
  }

  protected function reallyShow () {
    echo "{$this->x}\n";
  }
}

Running

Reflection::export(new ReflectionClass('Example'));

will yield (among other things):

  - Methods [4] {
    Method [ <user> public method getIncer ] {
      @@ /home/christian/dev/php5.3/c-tests/reflection.php 6 - 10
    }

Method [ <user> final public method __compiled_lambda_/home/christian/dev/php5.3/c-tests/reflection.php_0 ] {
      @@ /home/christian/dev/php5.3/c-tests/reflection.php 7 - 9
    }

    Method [ <user> public method show ] {
      @@ /home/christian/dev/php5.3/c-tests/reflection.php 12 - 14
    }

    Method [ <user> protected method reallyShow ] {
      @@ /home/christian/dev/php5.3/c-tests/reflection.php 16 - 18
    }
  }

So lambda functions appear simply as additional methods in the class,
with their generated name.

Of course, the ReflectionMethod / ReflectionFunction classes could be
extended so that it provides and additional method isLambda() in order
to determine whether a function actually is a lambda function. But I'd
rather do that in a separate step and a separate patch.

Regards,
Christian


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

Reply via email to