- Set scope when copying a closure with a new this pointer.

This commit is contained in:
Marcus Boerger 2009-01-04 14:22:51 +00:00
parent a85d2889bc
commit f408bcef15
2 changed files with 32 additions and 0 deletions

29
Zend/tests/closure_036.phpt Executable file
View File

@ -0,0 +1,29 @@
--TEST--
Closure 036: Rebinding closure $this on property access, using scope
--FILE--
<?php
$instance = 0;
class Test {
private $value = 42;
function __construct() {
global $instance;
$this->instance = ++$instance;
}
}
$o = new Test;
$o->func = function () {
var_dump($this->value);
};
$func = $o->func;
$func();
var_dump($instance);
?>
===DONE===
--EXPECTF--
int(42)
int(1)
===DONE===

View File

@ -134,6 +134,9 @@ ZEND_API zval* zend_closure_copy(zval *closure_obj, zval *this_ptr TSRMLS_DC) /*
closure->this_ptr = this_ptr;
if (this_ptr) {
Z_ADDREF_P(this_ptr);
closure->func.common.scope = Z_OBJCE_P(this_ptr);
} else {
closure->func.common.scope = NULL;
}
return closure_obj;
}