[RFC] Closures, Lambdas and use
| From: | Marcus Boerger | Date: | Sun, 04 Jan 2009 16:31:30 +0000 |
| Subject: | [RFC] Closures, Lambdas and use | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-42472@lists.php.net to get a copy of this message | ||
Hello Internals, Dmitry, Lukas, Johannes,
some time back (August 08) I complained about 'use' being at a weird
position and not at the same place as 'global' or 'static' where I
expected it. Back then Dmitry asked me to provide a patch to check out
the alternative. Now during the holidys I finally found some time to
change from:
$f = function() use ($x) {}
to:
$f = function() { use $x; }
Patch is attached.
Comments?
Best regards,
Marcus
Index: Zend/zend_language_parser.y =================================================================== RCS file: /repository/ZendEngine2/zend_language_parser.y,v retrieving revision 1.160.2.4.2.8.2.33 diff -u -p -d -r1.160.2.4.2.8.2.33 zend_language_parser.y --- Zend/zend_language_parser.y 2 Jan 2009 20:45:41 -0000 1.160.2.4.2.8.2.33 +++ Zend/zend_language_parser.y 4 Jan 2009 16:25:00 -0000 @@ -648,18 +648,27 @@ expr_without_variable: | '`' backticks_expr '`' { zend_do_shell_exec(&$$, &$2 TSRMLS_CC); } | T_PRINT expr { zend_do_print(&$$, &$2 TSRMLS_CC); } | function is_reference '(' { zend_do_begin_lambda_function_declaration(&$$, &$1, $2.op_type, 0 TSRMLS_CC); } - parameter_list ')' lexical_vars '{' inner_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); $$ = $4; } + parameter_list ')' '{' lambda_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); $$ = $4; } | T_STATIC function is_reference '(' { zend_do_begin_lambda_function_declaration(&$$, &$2, $3.op_type, 1 TSRMLS_CC); } - parameter_list ')' lexical_vars '{' inner_statement_list '}' { zend_do_end_function_declaration(&$2 TSRMLS_CC); $$ = $5; } + parameter_list ')' '{' lambda_statement_list '}' { zend_do_end_function_declaration(&$2 TSRMLS_CC); $$ = $5; } ; function: - T_FUNCTION { $$.u.opline_num = CG(zend_lineno); } + T_FUNCTION { $$.u.opline_num = CG(zend_lineno); } ; -lexical_vars: +lambda_statement_list: /* empty */ - | T_USE '(' lexical_var_list ')' + | lambda_statement_list { zend_do_extended_info(TSRMLS_C); } lambda_statement { HANDLE_INTERACTIVE(); } +; + +lambda_statement: + lexical_vars { $$ = $1; } + | inner_statement { $$ = $1; } + + +lexical_vars: + T_USE lexical_var_list ';' ; lexical_var_list: Index: Zend/tests/closure_002.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_002.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_002.phpt --- Zend/tests/closure_002.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_002.phpt 4 Jan 2009 16:25:01 -0000 @@ -5,11 +5,13 @@ Closure 002: Lambda with lexical variabl $x = 4; -$lambda1 = function () use ($x) { +$lambda1 = function () { + use $x; echo "$x\n"; }; -$lambda2 = function () use (&$x) { +$lambda2 = function () { + use &$x; echo "$x\n"; }; Index: Zend/tests/closure_003.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_003.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_003.phpt --- Zend/tests/closure_003.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_003.phpt 4 Jan 2009 16:25:01 -0000 @@ -6,11 +6,13 @@ Closure 003: Lambda with lexical variabl function run () { $x = 4; - $lambda1 = function () use ($x) { + $lambda1 = function () { + use $x; echo "$x\n"; }; - $lambda2 = function () use (&$x) { + $lambda2 = function () { + use &$x; echo "$x\n"; }; Index: Zend/tests/closure_004.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_004.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_004.phpt --- Zend/tests/closure_004.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_004.phpt 4 Jan 2009 16:25:01 -0000 @@ -6,11 +6,13 @@ Closure 004: Lambda with lexical variabl function run () { $x = 4; - $lambda1 = function () use ($x) { + $lambda1 = function () { + use $x; echo "$x\n"; }; - $lambda2 = function () use (&$x) { + $lambda2 = function () { + use &$x; echo "$x\n"; $x++; }; Index: Zend/tests/closure_005.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_005.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_005.phpt --- Zend/tests/closure_005.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_005.phpt 4 Jan 2009 16:25:01 -0000 @@ -15,7 +15,8 @@ class A { } function getIncer($val) { - return function() use ($val) { + return function() { + use $val; $this->x += $val; }; } @@ -71,4 +72,4 @@ echo "Done\n"; 7 Destroyed -Fatal error: Using $this when not in object context in %sclosure_005.php on line 28 +Fatal error: Using $this when not in object context in %sclosure_005.php on line %d Index: Zend/tests/closure_006.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_006.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_006.phpt --- Zend/tests/closure_006.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_006.phpt 4 Jan 2009 16:25:01 -0000 @@ -4,7 +4,8 @@ Closure 006: Nested lambdas <?php $getClosure = function ($v) { - return function () use ($v) { + return function () { + use $v; echo "Hello World: $v!\n"; }; }; Index: Zend/tests/closure_009.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_009.phpt,v retrieving revision 1.2.2.3 diff -u -p -d -r1.2.2.3 closure_009.phpt --- Zend/tests/closure_009.phpt 14 Jul 2008 11:57:44 -0000 1.2.2.3 +++ Zend/tests/closure_009.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,13 +3,15 @@ Closure 009: Using static vars inside la --FILE-- <?php $a = 1; -$x = function ($x) use ($a) { +$x = function ($x) { + use $a; static $n = 0; $n++; $a = $n.':'.$a; echo $x.':'.$a."\n"; }; -$y = function ($x) use (&$a) { +$y = function ($x) { + use &$a; static $n = 0; $n++; $a = $n.':'.$a; Index: Zend/tests/closure_010.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_010.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_010.phpt --- Zend/tests/closure_010.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_010.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,7 +3,8 @@ Closure 010: Closure calls itself --FILE-- <?php $i = 3; -$lambda = function ($lambda) use (&$i) { +$lambda = function ($lambda) { + use &$i; if ($i==0) return; echo $i--."\n"; $lambda($lambda); Index: Zend/tests/closure_011.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_011.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_011.phpt --- Zend/tests/closure_011.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_011.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,7 +3,8 @@ Closure 011: Lexical copies not static i --FILE-- <?php $i = 1; -$lambda = function () use ($i) { +$lambda = function () { + use $i; return ++$i; }; $lambda(); Index: Zend/tests/closure_012.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_012.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_012.phpt --- Zend/tests/closure_012.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_012.phpt 4 Jan 2009 16:25:01 -0000 @@ -2,13 +2,15 @@ Closure 012: Undefined lexical variables --FILE-- <?php -$lambda = function () use ($i) { +$lambda = function () { + use $i; return ++$i; }; $lambda(); $lambda(); var_dump($i); -$lambda = function () use (&$i) { +$lambda = function () { + use &$i; return ++$i; }; $lambda(); @@ -16,9 +18,8 @@ $lambda(); var_dump($i); ?> --EXPECTF-- -Notice: Undefined variable: i in %sclosure_012.php on line 2 +Notice: Undefined variable: i in %sclosure_012.php on line %d -Notice: Undefined variable: i in %sclosure_012.php on line 7 +Notice: Undefined variable: i in %sclosure_012.php on line %d NULL int(2) - Index: Zend/tests/closure_018.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_018.phpt,v retrieving revision 1.1.2.1 diff -u -p -d -r1.1.2.1 closure_018.phpt --- Zend/tests/closure_018.phpt 14 Jul 2008 13:36:40 -0000 1.1.2.1 +++ Zend/tests/closure_018.phpt 4 Jan 2009 16:25:01 -0000 @@ -6,7 +6,8 @@ Closure 018: Assigning lambda to static class foo { public function test(&$x) { static $lambda; - $lambda = function &() use (&$x) { + $lambda = function &() { + use &$x; return $x = $x * $x; }; return $lambda(); Index: Zend/tests/closure_020.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_020.phpt,v retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.2 closure_020.phpt --- Zend/tests/closure_020.phpt 1 Jan 2009 16:22:44 -0000 1.1.2.2 +++ Zend/tests/closure_020.phpt 4 Jan 2009 16:25:01 -0000 @@ -8,7 +8,7 @@ class foo { public function x() { $a = &$this; - $this->a = function() use (&$a) { return $a; }; + $this->a = function() { use &$a; return $a; }; var_dump($this->a->__invoke()); var_dump(is_a($this->a, 'closure')); var_dump(is_callable($this->a)); Index: Zend/tests/closure_022.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_022.phpt,v retrieving revision 1.1.2.3 diff -u -p -d -r1.1.2.3 closure_022.phpt --- Zend/tests/closure_022.phpt 11 Aug 2008 08:49:00 -0000 1.1.2.3 +++ Zend/tests/closure_022.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,10 +3,10 @@ Closure 022: Closure properties --FILE-- <?php $a = 0; -$foo = function() use ($a) { +$foo = function() { + use $a; }; $foo->a = 1; ?> --EXPECTF-- -Catchable fatal error: Closure object cannot have properties in %sclosure_022.php on line 5 - +Catchable fatal error: Closure object cannot have properties in %sclosure_022.php on line %d Index: Zend/tests/closure_025.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_025.phpt,v retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.2 closure_025.phpt --- Zend/tests/closure_025.phpt 28 Jul 2008 14:10:00 -0000 1.1.2.2 +++ Zend/tests/closure_025.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,7 +3,7 @@ Closure 025: Using closure in create_fun --FILE-- <?php -$a = create_function('$x', 'return function($y) use ($x) { return $x * $y; };'); +$a = create_function('$x', 'return function($y) { use $x; return $x * $y; };'); var_dump($a(2)->__invoke(4)); Index: Zend/tests/closure_027.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_027.phpt,v retrieving revision 1.1.2.3 diff -u -p -d -r1.1.2.3 closure_027.phpt --- Zend/tests/closure_027.phpt 3 Nov 2008 19:28:32 -0000 1.1.2.3 +++ Zend/tests/closure_027.phpt 4 Jan 2009 16:25:01 -0000 @@ -12,7 +12,7 @@ test(function() { return new stdclass; } test(function() { }); -$a = function($x) use ($y) {}; +$a = function($x) { use $y; }; test($a); test(new stdclass); Index: Zend/tests/closure_029.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_029.phpt,v retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.2 closure_029.phpt --- Zend/tests/closure_029.phpt 28 Jul 2008 14:10:00 -0000 1.1.2.2 +++ Zend/tests/closure_029.phpt 4 Jan 2009 16:25:01 -0000 @@ -5,7 +5,7 @@ Closure 029: Testing lambda with instanc var_dump(function() { } instanceof closure); var_dump(function(&$x) { } instanceof closure); -var_dump(@function(&$x) use ($y, $z) { } instanceof closure); +var_dump(@function(&$x) { use $y, $z; } instanceof closure); ?> --EXPECT-- Index: Zend/tests/closure_034.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_034.phpt,v retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.2 closure_034.phpt --- Zend/tests/closure_034.phpt 3 Jan 2009 17:48:40 -0000 1.1.2.2 +++ Zend/tests/closure_034.phpt 4 Jan 2009 16:25:01 -0000 @@ -10,7 +10,8 @@ class Test { public $var = 42; function __construct() { global $outer; - $this->func1 = function($param, $other = "default") use ($outer) { + $this->func1 = function($param, $other = "default") { + use $outer; }; } } @@ -18,12 +19,14 @@ class Test { $o = new Test; var_dump($o->func1); -$o->func2 = function($param, $other = "default") use ($outer) { +$o->func2 = function($param, $other = "default") { + use $outer; }; var_dump($o->func2); -$func3 = function($param, $other = "default") use ($outer) { +$func3 = function($param, $other = "default") { + use $outer; }; var_dump($func3);
Index: Zend/zend_language_parser.y =================================================================== RCS file: /repository/ZendEngine2/zend_language_parser.y,v retrieving revision 1.160.2.4.2.8.2.33 diff -u -p -d -r1.160.2.4.2.8.2.33 zend_language_parser.y --- Zend/zend_language_parser.y 2 Jan 2009 20:45:41 -0000 1.160.2.4.2.8.2.33 +++ Zend/zend_language_parser.y 4 Jan 2009 16:25:00 -0000 @@ -648,18 +648,27 @@ expr_without_variable: | '`' backticks_expr '`' { zend_do_shell_exec(&$$, &$2 TSRMLS_CC); } | T_PRINT expr { zend_do_print(&$$, &$2 TSRMLS_CC); } | function is_reference '(' { zend_do_begin_lambda_function_declaration(&$$, &$1, $2.op_type, 0 TSRMLS_CC); } - parameter_list ')' lexical_vars '{' inner_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); $$ = $4; } + parameter_list ')' '{' lambda_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); $$ = $4; } | T_STATIC function is_reference '(' { zend_do_begin_lambda_function_declaration(&$$, &$2, $3.op_type, 1 TSRMLS_CC); } - parameter_list ')' lexical_vars '{' inner_statement_list '}' { zend_do_end_function_declaration(&$2 TSRMLS_CC); $$ = $5; } + parameter_list ')' '{' lambda_statement_list '}' { zend_do_end_function_declaration(&$2 TSRMLS_CC); $$ = $5; } ; function: - T_FUNCTION { $$.u.opline_num = CG(zend_lineno); } + T_FUNCTION { $$.u.opline_num = CG(zend_lineno); } ; -lexical_vars: +lambda_statement_list: /* empty */ - | T_USE '(' lexical_var_list ')' + | lambda_statement_list { zend_do_extended_info(TSRMLS_C); } lambda_statement { HANDLE_INTERACTIVE(); } +; + +lambda_statement: + lexical_vars { $$ = $1; } + | inner_statement { $$ = $1; } + + +lexical_vars: + T_USE lexical_var_list ';' ; lexical_var_list: Index: Zend/tests/closure_002.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_002.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_002.phpt --- Zend/tests/closure_002.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_002.phpt 4 Jan 2009 16:25:01 -0000 @@ -5,11 +5,13 @@ Closure 002: Lambda with lexical variabl $x = 4; -$lambda1 = function () use ($x) { +$lambda1 = function () { + use $x; echo "$x\n"; }; -$lambda2 = function () use (&$x) { +$lambda2 = function () { + use &$x; echo "$x\n"; }; Index: Zend/tests/closure_003.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_003.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_003.phpt --- Zend/tests/closure_003.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_003.phpt 4 Jan 2009 16:25:01 -0000 @@ -6,11 +6,13 @@ Closure 003: Lambda with lexical variabl function run () { $x = 4; - $lambda1 = function () use ($x) { + $lambda1 = function () { + use $x; echo "$x\n"; }; - $lambda2 = function () use (&$x) { + $lambda2 = function () { + use &$x; echo "$x\n"; }; Index: Zend/tests/closure_004.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_004.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_004.phpt --- Zend/tests/closure_004.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_004.phpt 4 Jan 2009 16:25:01 -0000 @@ -6,11 +6,13 @@ Closure 004: Lambda with lexical variabl function run () { $x = 4; - $lambda1 = function () use ($x) { + $lambda1 = function () { + use $x; echo "$x\n"; }; - $lambda2 = function () use (&$x) { + $lambda2 = function () { + use &$x; echo "$x\n"; $x++; }; Index: Zend/tests/closure_005.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_005.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_005.phpt --- Zend/tests/closure_005.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_005.phpt 4 Jan 2009 16:25:01 -0000 @@ -15,7 +15,8 @@ class A { } function getIncer($val) { - return function() use ($val) { + return function() { + use $val; $this->x += $val; }; } @@ -71,4 +72,4 @@ echo "Done\n"; 7 Destroyed -Fatal error: Using $this when not in object context in %sclosure_005.php on line 28 +Fatal error: Using $this when not in object context in %sclosure_005.php on line %d Index: Zend/tests/closure_006.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_006.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_006.phpt --- Zend/tests/closure_006.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_006.phpt 4 Jan 2009 16:25:01 -0000 @@ -4,7 +4,8 @@ Closure 006: Nested lambdas <?php $getClosure = function ($v) { - return function () use ($v) { + return function () { + use $v; echo "Hello World: $v!\n"; }; }; Index: Zend/tests/closure_009.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_009.phpt,v retrieving revision 1.2.2.3 diff -u -p -d -r1.2.2.3 closure_009.phpt --- Zend/tests/closure_009.phpt 14 Jul 2008 11:57:44 -0000 1.2.2.3 +++ Zend/tests/closure_009.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,13 +3,15 @@ Closure 009: Using static vars inside la --FILE-- <?php $a = 1; -$x = function ($x) use ($a) { +$x = function ($x) { + use $a; static $n = 0; $n++; $a = $n.':'.$a; echo $x.':'.$a."\n"; }; -$y = function ($x) use (&$a) { +$y = function ($x) { + use &$a; static $n = 0; $n++; $a = $n.':'.$a; Index: Zend/tests/closure_010.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_010.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_010.phpt --- Zend/tests/closure_010.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_010.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,7 +3,8 @@ Closure 010: Closure calls itself --FILE-- <?php $i = 3; -$lambda = function ($lambda) use (&$i) { +$lambda = function ($lambda) { + use &$i; if ($i==0) return; echo $i--."\n"; $lambda($lambda); Index: Zend/tests/closure_011.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_011.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_011.phpt --- Zend/tests/closure_011.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_011.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,7 +3,8 @@ Closure 011: Lexical copies not static i --FILE-- <?php $i = 1; -$lambda = function () use ($i) { +$lambda = function () { + use $i; return ++$i; }; $lambda(); Index: Zend/tests/closure_012.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_012.phpt,v retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.2 closure_012.phpt --- Zend/tests/closure_012.phpt 14 Jul 2008 09:49:02 -0000 1.2.2.2 +++ Zend/tests/closure_012.phpt 4 Jan 2009 16:25:01 -0000 @@ -2,13 +2,15 @@ Closure 012: Undefined lexical variables --FILE-- <?php -$lambda = function () use ($i) { +$lambda = function () { + use $i; return ++$i; }; $lambda(); $lambda(); var_dump($i); -$lambda = function () use (&$i) { +$lambda = function () { + use &$i; return ++$i; }; $lambda(); @@ -16,9 +18,8 @@ $lambda(); var_dump($i); ?> --EXPECTF-- -Notice: Undefined variable: i in %sclosure_012.php on line 2 +Notice: Undefined variable: i in %sclosure_012.php on line %d -Notice: Undefined variable: i in %sclosure_012.php on line 7 +Notice: Undefined variable: i in %sclosure_012.php on line %d NULL int(2) - Index: Zend/tests/closure_018.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_018.phpt,v retrieving revision 1.1.2.1 diff -u -p -d -r1.1.2.1 closure_018.phpt --- Zend/tests/closure_018.phpt 14 Jul 2008 13:36:40 -0000 1.1.2.1 +++ Zend/tests/closure_018.phpt 4 Jan 2009 16:25:01 -0000 @@ -6,7 +6,8 @@ Closure 018: Assigning lambda to static class foo { public function test(&$x) { static $lambda; - $lambda = function &() use (&$x) { + $lambda = function &() { + use &$x; return $x = $x * $x; }; return $lambda(); Index: Zend/tests/closure_020.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_020.phpt,v retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.2 closure_020.phpt --- Zend/tests/closure_020.phpt 1 Jan 2009 16:22:44 -0000 1.1.2.2 +++ Zend/tests/closure_020.phpt 4 Jan 2009 16:25:01 -0000 @@ -8,7 +8,7 @@ class foo { public function x() { $a = &$this; - $this->a = function() use (&$a) { return $a; }; + $this->a = function() { use &$a; return $a; }; var_dump($this->a->__invoke()); var_dump(is_a($this->a, 'closure')); var_dump(is_callable($this->a)); Index: Zend/tests/closure_022.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_022.phpt,v retrieving revision 1.1.2.3 diff -u -p -d -r1.1.2.3 closure_022.phpt --- Zend/tests/closure_022.phpt 11 Aug 2008 08:49:00 -0000 1.1.2.3 +++ Zend/tests/closure_022.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,10 +3,10 @@ Closure 022: Closure properties --FILE-- <?php $a = 0; -$foo = function() use ($a) { +$foo = function() { + use $a; }; $foo->a = 1; ?> --EXPECTF-- -Catchable fatal error: Closure object cannot have properties in %sclosure_022.php on line 5 - +Catchable fatal error: Closure object cannot have properties in %sclosure_022.php on line %d Index: Zend/tests/closure_025.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_025.phpt,v retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.2 closure_025.phpt --- Zend/tests/closure_025.phpt 28 Jul 2008 14:10:00 -0000 1.1.2.2 +++ Zend/tests/closure_025.phpt 4 Jan 2009 16:25:01 -0000 @@ -3,7 +3,7 @@ Closure 025: Using closure in create_fun --FILE-- <?php -$a = create_function('$x', 'return function($y) use ($x) { return $x * $y; };'); +$a = create_function('$x', 'return function($y) { use $x; return $x * $y; };'); var_dump($a(2)->__invoke(4)); Index: Zend/tests/closure_027.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_027.phpt,v retrieving revision 1.1.2.3 diff -u -p -d -r1.1.2.3 closure_027.phpt --- Zend/tests/closure_027.phpt 3 Nov 2008 19:28:32 -0000 1.1.2.3 +++ Zend/tests/closure_027.phpt 4 Jan 2009 16:25:01 -0000 @@ -12,7 +12,7 @@ test(function() { return new stdclass; } test(function() { }); -$a = function($x) use ($y) {}; +$a = function($x) { use $y; }; test($a); test(new stdclass); Index: Zend/tests/closure_029.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_029.phpt,v retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.2 closure_029.phpt --- Zend/tests/closure_029.phpt 28 Jul 2008 14:10:00 -0000 1.1.2.2 +++ Zend/tests/closure_029.phpt 4 Jan 2009 16:25:01 -0000 @@ -5,7 +5,7 @@ Closure 029: Testing lambda with instanc var_dump(function() { } instanceof closure); var_dump(function(&$x) { } instanceof closure); -var_dump(@function(&$x) use ($y, $z) { } instanceof closure); +var_dump(@function(&$x) { use $y, $z; } instanceof closure); ?> --EXPECT-- Index: Zend/tests/closure_034.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/closure_034.phpt,v retrieving revision 1.1.2.2 diff -u -p -d -r1.1.2.2 closure_034.phpt --- Zend/tests/closure_034.phpt 3 Jan 2009 17:48:40 -0000 1.1.2.2 +++ Zend/tests/closure_034.phpt 4 Jan 2009 16:25:01 -0000 @@ -10,7 +10,8 @@ class Test { public $var = 42; function __construct() { global $outer; - $this->func1 = function($param, $other = "default") use ($outer) { + $this->func1 = function($param, $other = "default") { + use $outer; }; } } @@ -18,12 +19,14 @@ class Test { $o = new Test; var_dump($o->func1); -$o->func2 = function($param, $other = "default") use ($outer) { +$o->func2 = function($param, $other = "default") { + use $outer; }; var_dump($o->func2); -$func3 = function($param, $other = "default") use ($outer) { +$func3 = function($param, $other = "default") { + use $outer; }; var_dump($func3);