+++ /dev/null
---TEST--
-Closure 034: var_dump() of a Closure
---FILE--
-<?php
-
-$outer = 25;
-
-class Test {
- public $func1;
- public $var = 42;
- function __construct() {
- global $outer;
- $this->func1 = function($param, $other = "default") use ($outer) {
- };
- }
-}
-
-$o = new Test;
-var_dump($o->func1);
-
-$o->func2 = function($param, $other = "default") use ($outer) {
-};
-
-var_dump($o->func2);
-
-$func3 = function($param, $other = "default") use ($outer) {
-};
-
-var_dump($func3);
-
-?>
-===DONE===
---EXPECTF--
-object(Closure)#%d (3) {
- ["this"]=>
- object(Test)#%d (2) {
- ["func1"]=>
- object(Closure)#%d (3) {
- ["this"]=>
- object(Test)#%d (2) {
- ["func1"]=>
- object(Closure)#%d (3) {
- ["this"]=>
- *RECURSION*
- ["static"]=>
- array(1) {
- ["outer"]=>
- int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
- }
- ["var"]=>
- int(42)
- }
- ["static"]=>
- array(1) {
- ["outer"]=>
- int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
- }
- ["var"]=>
- int(42)
- }
- ["static"]=>
- array(1) {
- ["outer"]=>
- int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
-}
-object(Closure)#%d (3) {
- ["this"]=>
- object(Test)#%d (3) {
- ["func1"]=>
- object(Closure)#%d (3) {
- ["this"]=>
- object(Test)#%d (3) {
- ["func1"]=>
- object(Closure)#%d (3) {
- ["this"]=>
- *RECURSION*
- ["static"]=>
- array(1) {
- ["outer"]=>
- int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
- }
- ["var"]=>
- int(42)
- ["func2"]=>
- object(Closure)#%d (3) {
- ["this"]=>
- *RECURSION*
- ["static"]=>
- array(1) {
- ["outer"]=>
- &int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
- }
- }
- ["static"]=>
- array(1) {
- ["outer"]=>
- int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
- }
- ["var"]=>
- int(42)
- ["func2"]=>
- object(Closure)#%d (3) {
- ["this"]=>
- object(Test)#%d (3) {
- ["func1"]=>
- object(Closure)#%d (3) {
- ["this"]=>
- *RECURSION*
- ["static"]=>
- array(1) {
- ["outer"]=>
- int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
- }
- ["var"]=>
- int(42)
- ["func2"]=>
- object(Closure)#%d (3) {
- ["this"]=>
- *RECURSION*
- ["static"]=>
- array(1) {
- ["outer"]=>
- &int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
- }
- }
- ["static"]=>
- array(1) {
- ["outer"]=>
- &int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
- }
- }
- ["static"]=>
- array(1) {
- ["outer"]=>
- &int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
-}
-object(Closure)#%d (3) {
- ["this"]=>
- NULL
- ["static"]=>
- array(1) {
- ["outer"]=>
- int(25)
- }
- ["parameter"]=>
- array(2) {
- ["$param"]=>
- string(10) "<required>"
- ["$other"]=>
- string(10) "<optional>"
- }
-}
-===DONE===
+++ /dev/null
---TEST--
-Closure 035: Rebinding closure $this on property access
---FILE--
-<?php
-
-$instance = 0;
-
-class Test {
- function __construct() {
- global $instance;
- $this->instance = ++$instance;
- }
-}
-
-$o = new Test;
-$o->func = function () {
- var_dump($this);
-};
-$func = $o->func;
-$func();
-
-var_dump($instance);
-?>
-===DONE===
---EXPECTF--
-object(Test)#%d (2) {
- ["instance"]=>
- int(1)
- ["func"]=>
- object(Closure)#%d (1) {
- ["this"]=>
- object(Test)#%d (2) {
- ["instance"]=>
- int(1)
- ["func"]=>
- object(Closure)#%d (1) {
- ["this"]=>
- *RECURSION*
- }
- }
- }
-}
-int(1)
-===DONE===
\ No newline at end of file
+++ /dev/null
---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===
\ No newline at end of file
}
/* }}} */
-ZEND_API zval* zend_closure_copy(zval *closure_obj, zval *this_ptr TSRMLS_DC) /* {{{ */
-{
- zend_closure *closure;
-
- zval_copy_ctor(closure_obj);
- closure = (zend_closure *)zend_object_store_get_object(closure_obj TSRMLS_CC);
- if (closure->this_ptr) {
- zval_ptr_dtor(&closure->this_ptr);
- }
- 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;
-}
-/* }}} */
-
static zend_function *zend_closure_get_method(zval **object_ptr, char *method_name, int method_len TSRMLS_DC) /* {{{ */
{
char *lc_name;
member = tmp_member;
}
- if (value && Z_TYPE_P(value) == IS_OBJECT && Z_OBJCE_P(value) == zend_ce_closure && zend_get_closure_this_ptr(value TSRMLS_CC) != object) {
- value = zend_closure_copy(value, object TSRMLS_CC);
- }
-
property_info = zend_get_property_info(zobj->ce, member, (zobj->ce->__set != NULL) TSRMLS_CC);
if (property_info && zend_hash_quick_find(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, (void **) &variable_ptr) == SUCCESS) {