Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_closures.c zend_closures.h zend_object_handlers.c /tests closure_033.phpt closure_034.phpt
[email protected] (Marcus Boerger) Sun, 11 Jan 2009 14:13:32 +0100
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <[email protected]> |
Hello Dmitry,
it's what prototyping requires. I just made this behave as expected.
marcus
Sunday, January 11, 2009, 9:09:14 AM, you wrote:
> Hi Marcus,
> I'm wondered where this behavior comes from (It was never proposed or
> may be I missed it).
> Now, the simple assignment of closure to property and back changes its
> internal $this pointer.
> As result the following example is broken.
> <?php
> class A {
> private $a = 0;
> public $bar;
> function foo() {
> return function() {
> return $this->a++;
> };
> }
> }
> class B {
> public $bar;
> function foo($a) {
> return $a->foo();
> }
> }
> $a = new A;
> $b = new B;
> $f1 = $a->foo();
> $f2 = $b->foo($a);
> var_dump($f1());
> var_dump($f1());
> var_dump($f2());
> var_dump($f2());
> var_dump($f1());
> $a->bar = $f1;
> $b->bar = $f2;
> $f1 = $a->bar;
> $f2 = $b->bar; // REASON OF THE BUG
> var_dump($f1());
> var_dump($f1());
> var_dump($f2()); // BUG
> var_dump($f2());
> var_dump($f1());
?>>
> Thanks. Dmitry.
> Marcus Boerger wrote:
>> helly Sat Jan 3 17:46:25 2009 UTC
>>
>> Added files:
>> /ZendEngine2/tests closure_033.phpt closure_034.phpt
>>
>> Modified files:
>> /ZendEngine2 zend_closures.c zend_closures.h zend_object_handlers.c
>> Log:
>> - Rebind closure when binding to property
>>
>>
Best regards,
Marcus