Skip to content

Commit bc09012

Browse files
committed
Partial named params implementation
Very incomplete, no proper support for zpp.
1 parent 7352213 commit bc09012

18 files changed

+4002
-2178
lines changed

Zend/tests/named_params/basic.phpt

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
--TEST--
2+
Basic test
3+
--FILE--
4+
<?php
5+
6+
function test($a, $b, $c = "c", $d = "d", $e = "e") {
7+
echo "a=$a, b=$b, c=$c, d=$d, e=$e\n";
8+
}
9+
10+
function test3(&$a, &$b, &$c = "c", &$d = "d", &$e = "e") {
11+
echo "a=$a, b=$b, c=$c, d=$d, e=$e\n";
12+
}
13+
14+
function &id($x) {
15+
return $x;
16+
}
17+
18+
$a = "A"; $b = "B"; $c = "C"; $d = "D"; $e = "E";
19+
20+
echo "SEND_VAL:\n";
21+
test("A", "B", "C", d => "D", e => "E");
22+
test("A", "B", "C", e => "E", d => "D");
23+
test(e => "E", a => "A", d => "D", b => "B", c => "C");
24+
test("A", "B", "C", e => "E");
25+
26+
echo "SEND_VAL_EX:\n";
27+
test2("A", "B", "C", d => "D", e => "E");
28+
test2("A", "B", "C", e => "E", d => "D");
29+
test2(e => "E", a => "A", d => "D", b => "B", c => "C");
30+
test2("A", "B", "C", e => "E");
31+
32+
echo "SEND_VAR:\n";
33+
test($a, $b, $c, d => $d, e => $e);
34+
test($a, $b, $c, e => $e, d => $d);
35+
test(e => $e, a => $a, d => $d, b => $b, c => $c);
36+
test(a => $a, b => $b, c => $c, e => $e);
37+
38+
echo "SEND_VAR_EX:\n";
39+
test2($a, $b, $c, d => $d, e => $e);
40+
test2($a, $b, $c, e => $e, d => $d);
41+
test2(e => $e, a => $a, d => $d, b => $b, c => $c);
42+
test2(a => $a, b => $b, c => $c, e => $e);
43+
44+
echo "SEND_VAR_NO_REF:\n";
45+
test3(id("A"), id("B"), id("C"), d => id("D"), e => id("E"));
46+
test3(id("A"), id("B"), id("C"), e => id("E"), d => id("D"));
47+
test3(e => id("E"), a => id("A"), d => id("D"), b => id("B"), c => id("C"));
48+
test3(id("A"), id("B"), id("C"), e => id("E"));
49+
50+
echo "SEND_VAR_NO_REF_EX:\n";
51+
test4(id("A"), id("B"), id("C"), d => id("D"), e => id("E"));
52+
test4(id("A"), id("B"), id("C"), e => id("E"), d => id("D"));
53+
test4(e => id("E"), a => id("A"), d => id("D"), b => id("B"), c => id("C"));
54+
test4(id("A"), id("B"), id("C"), e => id("E"));
55+
56+
echo "SEND_REF:\n";
57+
test3($a, $b, $c, d => $d, e => $e);
58+
test3($a, $b, $c, e => $e, d => $d);
59+
test3(e => $e, a => $a, d => $d, b => $b, c => $c);
60+
test3(a => $a, b => $b, c => $c, e => $e);
61+
62+
function test2($a, $b, $c = "c", $d = "d", $e = "e") {
63+
echo "a=$a, b=$b, c=$c, d=$d, e=$e\n";
64+
}
65+
66+
function test4(&$a, &$b, &$c = "c", &$d = "d", &$e = "e") {
67+
echo "a=$a, b=$b, c=$c, d=$d, e=$e\n";
68+
}
69+
70+
?>
71+
--EXPECT--
72+
SEND_VAL:
73+
a=A, b=B, c=C, d=D, e=E
74+
a=A, b=B, c=C, d=D, e=E
75+
a=A, b=B, c=C, d=D, e=E
76+
a=A, b=B, c=C, d=d, e=E
77+
SEND_VAL_EX:
78+
a=A, b=B, c=C, d=D, e=E
79+
a=A, b=B, c=C, d=D, e=E
80+
a=A, b=B, c=C, d=D, e=E
81+
a=A, b=B, c=C, d=d, e=E
82+
SEND_VAR:
83+
a=A, b=B, c=C, d=D, e=E
84+
a=A, b=B, c=C, d=D, e=E
85+
a=A, b=B, c=C, d=D, e=E
86+
a=A, b=B, c=C, d=d, e=E
87+
SEND_VAR_EX:
88+
a=A, b=B, c=C, d=D, e=E
89+
a=A, b=B, c=C, d=D, e=E
90+
a=A, b=B, c=C, d=D, e=E
91+
a=A, b=B, c=C, d=d, e=E
92+
SEND_VAR_NO_REF:
93+
a=A, b=B, c=C, d=D, e=E
94+
a=A, b=B, c=C, d=D, e=E
95+
a=A, b=B, c=C, d=D, e=E
96+
a=A, b=B, c=C, d=d, e=E
97+
SEND_VAR_NO_REF_EX:
98+
a=A, b=B, c=C, d=D, e=E
99+
a=A, b=B, c=C, d=D, e=E
100+
a=A, b=B, c=C, d=D, e=E
101+
a=A, b=B, c=C, d=d, e=E
102+
SEND_REF:
103+
a=A, b=B, c=C, d=D, e=E
104+
a=A, b=B, c=C, d=D, e=E
105+
a=A, b=B, c=C, d=D, e=E
106+
a=A, b=B, c=C, d=d, e=E
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
Duplicate param
3+
--FILE--
4+
<?php
5+
6+
function test($a) {}
7+
8+
try {
9+
test(a => 1, a => 2);
10+
} catch (Error $e) {
11+
echo $e->getMessage(), "\n";
12+
}
13+
14+
try {
15+
test(1, a => 2);
16+
} catch (Error $e) {
17+
echo $e->getMessage(), "\n";
18+
}
19+
20+
?>
21+
--EXPECT--
22+
Named parameter $a overwrites previous argument
23+
Named parameter $a overwrites previous argument

Zend/tests/named_params/internal.phpt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--TEST--
2+
Named params on internal functions
3+
--FILE--
4+
<?php
5+
6+
var_dump(array_slice(arg => [1, 2, 3, 4, 5], offset => 2, length => 2));
7+
var_dump(array_slice(length => 2, offset => 2, arg => [1, 2, 3, 4, 5]));
8+
9+
// These don't work correctly!
10+
var_dump(array_slice(arg => ['a' => 0, 'b' => 1], offset => 1, preserve_keys => true));
11+
var_dump(array_slice(['a' => 0, 'b' => 1], preserve_keys => true, offset => 1));
12+
13+
?>
14+
--EXPECT--
15+
array(2) {
16+
[0]=>
17+
int(3)
18+
[1]=>
19+
int(4)
20+
}
21+
array(2) {
22+
[0]=>
23+
int(3)
24+
[1]=>
25+
int(4)
26+
}
27+
array(0) {
28+
}
29+
array(0) {
30+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Cannot used positional parameter after named parameter
3+
--FILE--
4+
<?php
5+
6+
test(a => 1, 2);
7+
8+
?>
9+
--EXPECTF--
10+
Fatal error: Cannot use positional argument after named argument in %s on line %d
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
Check that reference detection works properly
3+
--FILE--
4+
<?php
5+
6+
$v00 = $v01 = $v32 = $v33 = 0;
7+
test(p32 => $v32, p33 => $v33, p00 => $v00, p01 => $v01);
8+
echo "$v00 $v01 $v32 $v33\n";
9+
10+
$v = [0 => 0, 1 => 0, 32 => 0, 33 => 0];
11+
test(p32 => $v[32], p33 => $v[33], p00 => $v[0], p01 => $v[1]);
12+
echo "$v[0] $v[1] $v[32] $v[33]\n";
13+
14+
function test(
15+
&$p00 = null, $p01 = null, &$p02 = null, $p03 = null, &$p04 = null, $p05 = null,
16+
&$p06 = null, $p07 = null, &$p08 = null, $p09 = null, &$p10 = null, $p11 = null,
17+
&$p12 = null, $p13 = null, &$p14 = null, $p15 = null, &$p16 = null, $p17 = null,
18+
&$p18 = null, $p19 = null, &$p20 = null, $p21 = null, &$p22 = null, $p23 = null,
19+
&$p24 = null, $p25 = null, &$p26 = null, $p27 = null, &$p28 = null, $p29 = null,
20+
&$p30 = null, $p31 = null, &$p32 = null, $p33 = null, &$p34 = null, $p35 = null
21+
) {
22+
$p00++;
23+
$p32++;
24+
}
25+
26+
$v00 = $v01 = $v32 = $v33 = 0;
27+
test(p32 => $v32, p33 => $v33, p00 => $v00, p01 => $v01);
28+
echo "$v00 $v01 $v32 $v33\n";
29+
30+
$v = [0 => 0, 1 => 0, 32 => 0, 33 => 0];
31+
test(p32 => $v[32], p33 => $v[33], p00 => $v[0], p01 => $v[1]);
32+
echo "$v[0] $v[1] $v[32] $v[33]\n";
33+
34+
?>
35+
--EXPECT--
36+
1 0 1 0
37+
1 0 1 0
38+
1 0 1 0
39+
1 0 1 0
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
Unknown named parameter
3+
--FILE--
4+
<?php
5+
6+
function test($a) {
7+
}
8+
9+
function test2(...$a) {
10+
}
11+
12+
try {
13+
test(b => 42);
14+
} catch (Error $e) {
15+
echo $e->getMessage(), "\n";
16+
}
17+
18+
// This may be supported in the future.
19+
try {
20+
test2(a => 42);
21+
} catch (Error $e) {
22+
echo $e->getMessage(), "\n";
23+
}
24+
25+
?>
26+
--EXPECT--
27+
Unknown named parameter $b
28+
Unknown named parameter $a
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Mixing unpacking and named params (1)
3+
--FILE--
4+
<?php
5+
6+
test(...[], a => 42);
7+
8+
?>
9+
--EXPECTF--
10+
Fatal error: Cannot combine named arguments and argument unpacking in %s on line %d
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Mixing unpacking and named params (2)
3+
--FILE--
4+
<?php
5+
6+
test(a => 42, ...[]);
7+
8+
?>
9+
--EXPECTF--
10+
Fatal error: Cannot combine named arguments and argument unpacking in %s on line %d

Zend/zend_ast.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ enum _zend_ast_kind {
139139
ZEND_AST_TRAIT_ALIAS,
140140
ZEND_AST_GROUP_USE,
141141
ZEND_AST_PROP_GROUP,
142+
ZEND_AST_NAMED_ARG,
142143

143144
/* 3 child nodes */
144145
ZEND_AST_METHOD_CALL = 3 << ZEND_AST_NUM_CHILDREN_SHIFT,

0 commit comments

Comments
 (0)