File tree Expand file tree Collapse file tree 9 files changed +102
-115
lines changed
Zend/tests/arrow_functions Expand file tree Collapse file tree 9 files changed +102
-115
lines changed Original file line number Diff line number Diff line change @@ -12,8 +12,34 @@ var_dump($foo(2));
12
12
$ foo = fn ($ x , $ y ) => $ x + $ y ;
13
13
var_dump ($ foo (1 , 2 ));
14
14
15
+ // Closing over $var
16
+ $ var = 4 ;
17
+ $ foo = fn () => $ var ;
18
+ var_dump ($ foo ());
19
+
20
+ // Not closing over $var, it's a parameter
21
+ $ foo = fn ($ var ) => $ var ;
22
+ var_dump ($ foo (5 ));
23
+
24
+ // Close over $var by-value, not by-reference
25
+ $ var = 5 ;
26
+ $ foo = fn () => ++$ var ;
27
+ var_dump ($ foo ());
28
+ var_dump ($ var );
29
+
30
+ // Nested arrow functions closing over variable
31
+ $ var = 6 ;
32
+ var_dump ((fn () => fn () => $ var )()());
33
+ var_dump ((fn () => function () use ($ var ) { return $ var ; })()());
34
+
15
35
?>
16
36
--EXPECT--
17
37
int(1)
18
38
int(2)
19
39
int(3)
40
+ int(4)
41
+ int(5)
42
+ int(6)
43
+ int(5)
44
+ int(6)
45
+ int(6)
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ Arrow functions implicit use must be throwing notices only upon actual use
3
+ --FILE--
4
+ <?php
5
+
6
+ $ b = 1 ;
7
+
8
+ var_dump ((fn () => $ b + $ c )());
9
+
10
+ ?>
11
+ --EXPECTF--
12
+ Notice: Undefined variable: c in %s on line %d
13
+ int(1)
Original file line number Diff line number Diff line change 1
1
--TEST--
2
- Arrow function closing over variable
2
+ Variable-variables inside arrow functions
3
3
--FILE--
4
4
<?php
5
5
6
- $ b = 1 ;
6
+ $ a = 1 ;
7
+ $ var = "a " ;
8
+ $ fn = fn () => $ $ var ;
9
+ var_dump ($ fn ());
7
10
8
- var_dump ((fn () => $ b )());
11
+ $ {5 } = 2 ;
12
+ $ fn = fn () => $ {5 };
13
+ var_dump ($ fn ());
9
14
10
15
?>
11
- --EXPECT--
12
- int(1)
16
+ --EXPECTF--
17
+ Notice: Undefined variable: a in %s on line %d
18
+ NULL
19
+
20
+ Notice: Undefined variable: 5 in %s on line %d
21
+ NULL
Original file line number Diff line number Diff line change 1
1
--TEST--
2
- Arrow functions implicit use must be throwing notices only upon actual use
2
+ Auto-globals in arrow functions
3
3
--FILE--
4
4
<?php
5
5
6
- $ b = 1 ;
7
-
8
- var_dump ((fn () => $ b + $ c )());
6
+ // This should work, but *not* generate a binding for $GLOBALS
7
+ $ a = 123 ;
8
+ $ fn = fn () => $ GLOBALS ['a ' ];
9
+ var_dump ($ fn ());
9
10
10
11
?>
11
- --EXPECTF--
12
- Notice: Undefined variable: c in %s on line %d
13
- int(1)
12
+ --EXPECT--
13
+ int(123)
Original file line number Diff line number Diff line change 1
1
--TEST--
2
- Arrow function closing over variable by value
2
+ Arrow function $this binding
3
3
--FILE--
4
4
<?php
5
5
6
- $ b = 2 ;
6
+ class Test {
7
+ public function method () {
8
+ // It would be okay if this is NULL, but the rest should work
9
+ $ fn = fn () => 42 ;
10
+ $ r = new ReflectionFunction ($ fn );
11
+ var_dump ($ r ->getClosureThis ());
12
+
13
+ $ fn = fn () => $ this ;
14
+ var_dump ($ fn ());
15
+
16
+ $ fn = fn () => Test::method2 ();
17
+ $ fn ();
18
+
19
+ $ fn = fn () => call_user_func ('Test::method2 ' );
20
+ $ fn ();
21
+
22
+ $ thisName = "this " ;
23
+ $ fn = fn () => $ $ thisName ;
24
+ var_dump ($ fn ());
25
+
26
+ $ fn = fn () => self ::class;
27
+ var_dump ($ fn ());
28
+ }
29
+
30
+ public function method2 () {
31
+ var_dump ($ this );
32
+ }
33
+ }
34
+
35
+ (new Test )->method ();
7
36
8
- var_dump ((fn () => ++$ b )());
9
- var_dump ($ b );
10
37
?>
11
38
--EXPECT--
12
- int(3)
13
- int(2)
39
+ object(Test)#1 (0) {
40
+ }
41
+ object(Test)#1 (0) {
42
+ }
43
+ object(Test)#1 (0) {
44
+ }
45
+ object(Test)#1 (0) {
46
+ }
47
+ object(Test)#1 (0) {
48
+ }
49
+ string(4) "Test"
Load Diff This file was deleted.
Load Diff This file was deleted.
Load Diff This file was deleted.
Load Diff This file was deleted.
You can’t perform that action at this time.
0 commit comments