- 添加了嵌套lambda表达式的支持,实现类中的闭包嵌套功能 - 实现了preg_replace_callback中lambda表达式的使用场景 - 支持在lambda内部使用静态变量的功能 - 完善了闭包自调用的实现逻辑 - 添加了四个新的闭包测试用例(closure_007-010) - 在编译器基类中增加了inClosure状态标识 - 修复了return语句在闭包中的处理逻辑 - 更新了闭包函数体的返回值处理方式pull/1/head
parent
be22aa751f
commit
67427f342d
5 changed files with 127 additions and 3 deletions
@ -0,0 +1,41 @@ |
||||
--TEST-- |
||||
Closure 007: Nested lambdas in classes |
||||
--FILE-- |
||||
<?php |
||||
|
||||
class A { |
||||
private $x = 0; |
||||
|
||||
function getClosureGetter () { |
||||
return function () { |
||||
return function () { |
||||
$this->x++; |
||||
}; |
||||
}; |
||||
} |
||||
|
||||
function printX () { |
||||
echo $this->x."\n"; |
||||
} |
||||
} |
||||
|
||||
function main() { |
||||
$a = new A; |
||||
$a->printX(); |
||||
$getClosure = $a->getClosureGetter(); |
||||
$a->printX(); |
||||
$closure = $getClosure(); |
||||
$a->printX(); |
||||
$closure(); |
||||
$a->printX(); |
||||
|
||||
echo "Done\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
0 |
||||
0 |
||||
0 |
||||
1 |
||||
Done |
||||
@ -0,0 +1,24 @@ |
||||
--TEST-- |
||||
Closure 008: Use in preg_replace_callback() |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function replace_spaces($text) { |
||||
$lambda = function ($matches) { |
||||
return str_replace(' ', ' ', $matches[1]).' '; |
||||
}; |
||||
return preg_replace_callback('/( +) /', $lambda, $text); |
||||
} |
||||
|
||||
function main() { |
||||
echo replace_spaces("1 2 3\n"); |
||||
echo replace_spaces("1 2 3\n"); |
||||
echo replace_spaces("1 2 3\n"); |
||||
echo "Done\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
1 2 3 |
||||
1 2 3 |
||||
1 2 3 |
||||
Done |
||||
@ -0,0 +1,33 @@ |
||||
--TEST-- |
||||
Closure 009: Using static vars inside lambda |
||||
--FILE-- |
||||
<?php |
||||
function main() { |
||||
$a = 1; |
||||
$x = function ($x) use ($a) { |
||||
static $n = 0; |
||||
$n++; |
||||
$a = $n.':'.$a; |
||||
echo $x.':'.$a."\n"; |
||||
}; |
||||
$y = function ($x) use (&$a) { |
||||
static $n = 0; |
||||
$n++; |
||||
$a = $n.':'.$a; |
||||
echo $x.':'.$a."\n"; |
||||
}; |
||||
$x(1); |
||||
$x(2); |
||||
$x(3); |
||||
$y(4); |
||||
$y(5); |
||||
$y(6); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
1:1:1 |
||||
2:2:1 |
||||
3:3:1 |
||||
4:1:1 |
||||
5:2:1:1 |
||||
6:3:2:1:1 |
||||
@ -0,0 +1,20 @@ |
||||
--TEST-- |
||||
Closure 010: Closure calls itself |
||||
--FILE-- |
||||
<?php |
||||
function main() { |
||||
$i = 3; |
||||
$lambda = function ($lambda) use (&$i) { |
||||
if ($i==0) return; |
||||
echo $i--."\n"; |
||||
$lambda($lambda); |
||||
}; |
||||
$lambda($lambda); |
||||
echo "$i\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
3 |
||||
2 |
||||
1 |
||||
0 |
||||
Loading…
Reference in new issue