Skip to content

Commit 524abac

Browse files
Add func_get_named_args()
1 parent bdffded commit 524abac

9 files changed

+431
-17
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ PHP NEWS
7272
(nielsdos)
7373
. Optimized PHP html_entity_decode function. (Artem Ukrainskiy)
7474
. Minor optimization to array_chunk(). (nielsdos)
75+
. Added func_get_named_args() function. (alexandre-daubois)
7576

7677
- URI:
7778
. Empty host handling is fixed. (Máté Kocsis)

UPGRADING

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ PHP 8.5 UPGRADE NOTES
506506
- Standard:
507507
. Added array_first() and array_last().
508508
RFC: https://wiki.php.net/rfc/array_first_last
509+
. Added func_get_named_args() function.
509510

510511
========================================
511512
7. New Classes and Interfaces

Zend/tests/func_get_named_args.phpt

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
--TEST--
2+
Testing func_get_named_args()
3+
--FILE--
4+
<?php
5+
6+
function test($a, $b = 'default_b', $c = 'default_c') {
7+
return func_get_named_args();
8+
}
9+
10+
var_dump(test('A', 'B', 'C'));
11+
var_dump(test(c: 'C', a: 'A'));
12+
var_dump(test('A', c: 'C'));
13+
14+
function variadic_test($a, $b, ...$rest) {
15+
return func_get_named_args();
16+
}
17+
18+
var_dump(variadic_test('A', 'B', 'C', 'D'));
19+
20+
function no_args() {
21+
return func_get_named_args();
22+
}
23+
24+
var_dump(no_args());
25+
26+
try {
27+
func_get_named_args();
28+
} catch (Error $e) {
29+
echo "Error: " . $e->getMessage() . "\n";
30+
}
31+
32+
function by_ref($a, &$b) {
33+
return func_get_named_args();
34+
}
35+
36+
var_dump(by_ref('A', $b));
37+
38+
?>
39+
--EXPECT--
40+
array(3) {
41+
["a"]=>
42+
string(1) "A"
43+
["b"]=>
44+
string(1) "B"
45+
["c"]=>
46+
string(1) "C"
47+
}
48+
array(3) {
49+
["a"]=>
50+
string(1) "A"
51+
["b"]=>
52+
string(9) "default_b"
53+
["c"]=>
54+
string(1) "C"
55+
}
56+
array(3) {
57+
["a"]=>
58+
string(1) "A"
59+
["b"]=>
60+
string(9) "default_b"
61+
["c"]=>
62+
string(1) "C"
63+
}
64+
array(4) {
65+
["a"]=>
66+
string(1) "A"
67+
["b"]=>
68+
string(1) "B"
69+
[2]=>
70+
string(1) "C"
71+
[3]=>
72+
string(1) "D"
73+
}
74+
array(0) {
75+
}
76+
Error: func_get_named_args() cannot be called from the global scope
77+
array(2) {
78+
["a"]=>
79+
string(1) "A"
80+
["b"]=>
81+
NULL
82+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
--TEST--
2+
Testing func_get_named_args() with anonymous functions and closures
3+
--FILE--
4+
<?php
5+
6+
$anonymousFunc = function($a, $b = 'default_b', $c = 'default_c') {
7+
return func_get_named_args();
8+
};
9+
10+
var_dump($anonymousFunc('A', 'B', 'C'));
11+
var_dump($anonymousFunc(c: 'C', a: 'A'));
12+
var_dump($anonymousFunc('A', c: 'C'));
13+
14+
$capturedVar = 'captured';
15+
$closure = function($x, $y = 'default_y') use ($capturedVar) {
16+
return func_get_named_args();
17+
};
18+
19+
var_dump($closure('X', 'Y'));
20+
var_dump($closure(y: 'Y', x: 'X'));
21+
22+
$variadicFunc = function($first, ...$rest) {
23+
return func_get_named_args();
24+
};
25+
26+
var_dump($variadicFunc('FIRST', 'extra1', 'extra2'));
27+
var_dump($variadicFunc(first: 'FIRST', extra: 'EXTRA'));
28+
29+
$arrow = fn($p, $q = 'default_q') => func_get_named_args();
30+
31+
var_dump($arrow('P', 'Q'));
32+
var_dump($arrow(q: 'Q', p: 'P'));
33+
34+
$mapped = array_map(function($item, $prefix = 'prefix') {
35+
return func_get_named_args();
36+
}, ['test']);
37+
var_dump($mapped[0]);
38+
39+
?>
40+
--EXPECT--
41+
array(3) {
42+
["a"]=>
43+
string(1) "A"
44+
["b"]=>
45+
string(1) "B"
46+
["c"]=>
47+
string(1) "C"
48+
}
49+
array(3) {
50+
["a"]=>
51+
string(1) "A"
52+
["b"]=>
53+
string(9) "default_b"
54+
["c"]=>
55+
string(1) "C"
56+
}
57+
array(3) {
58+
["a"]=>
59+
string(1) "A"
60+
["b"]=>
61+
string(9) "default_b"
62+
["c"]=>
63+
string(1) "C"
64+
}
65+
array(2) {
66+
["x"]=>
67+
string(1) "X"
68+
["y"]=>
69+
string(1) "Y"
70+
}
71+
array(2) {
72+
["x"]=>
73+
string(1) "X"
74+
["y"]=>
75+
string(1) "Y"
76+
}
77+
array(3) {
78+
["first"]=>
79+
string(5) "FIRST"
80+
[1]=>
81+
string(6) "extra1"
82+
[2]=>
83+
string(6) "extra2"
84+
}
85+
array(2) {
86+
["first"]=>
87+
string(5) "FIRST"
88+
["extra"]=>
89+
string(5) "EXTRA"
90+
}
91+
array(2) {
92+
["p"]=>
93+
string(1) "P"
94+
["q"]=>
95+
string(1) "Q"
96+
}
97+
array(2) {
98+
["p"]=>
99+
string(1) "P"
100+
["q"]=>
101+
string(1) "Q"
102+
}
103+
array(1) {
104+
["item"]=>
105+
string(4) "test"
106+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
--TEST--
2+
Testing func_get_named_args() with methods
3+
--FILE--
4+
<?php
5+
6+
class TestClass {
7+
public function instanceMethod($a, $b = 'default_b', $c = 'default_c') {
8+
return func_get_named_args();
9+
}
10+
11+
public static function staticMethod($x, $y = 'default_y', $z = 'default_z') {
12+
return func_get_named_args();
13+
}
14+
15+
public function variadicMethod($first, ...$rest) {
16+
return func_get_named_args();
17+
}
18+
}
19+
20+
$obj = new TestClass();
21+
22+
var_dump($obj->instanceMethod('A', 'B', 'C'));
23+
var_dump($obj->instanceMethod(c: 'C', a: 'A'));
24+
var_dump($obj->instanceMethod('A', c: 'C'));
25+
26+
var_dump(TestClass::staticMethod('X', 'Y', 'Z'));
27+
var_dump(TestClass::staticMethod(z: 'Z', x: 'X'));
28+
29+
var_dump($obj->variadicMethod('FIRST', 'extra1', 'extra2'));
30+
var_dump($obj->variadicMethod(first: 'FIRST', extra: 'EXTRA'));
31+
32+
?>
33+
--EXPECT--
34+
array(3) {
35+
["a"]=>
36+
string(1) "A"
37+
["b"]=>
38+
string(1) "B"
39+
["c"]=>
40+
string(1) "C"
41+
}
42+
array(3) {
43+
["a"]=>
44+
string(1) "A"
45+
["b"]=>
46+
string(9) "default_b"
47+
["c"]=>
48+
string(1) "C"
49+
}
50+
array(3) {
51+
["a"]=>
52+
string(1) "A"
53+
["b"]=>
54+
string(9) "default_b"
55+
["c"]=>
56+
string(1) "C"
57+
}
58+
array(3) {
59+
["x"]=>
60+
string(1) "X"
61+
["y"]=>
62+
string(1) "Y"
63+
["z"]=>
64+
string(1) "Z"
65+
}
66+
array(3) {
67+
["x"]=>
68+
string(1) "X"
69+
["y"]=>
70+
string(9) "default_y"
71+
["z"]=>
72+
string(1) "Z"
73+
}
74+
array(3) {
75+
["first"]=>
76+
string(5) "FIRST"
77+
[1]=>
78+
string(6) "extra1"
79+
[2]=>
80+
string(6) "extra2"
81+
}
82+
array(2) {
83+
["first"]=>
84+
string(5) "FIRST"
85+
["extra"]=>
86+
string(5) "EXTRA"
87+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
--TEST--
2+
Testing func_get_named_args() with spread operator
3+
--FILE--
4+
<?php
5+
6+
function hello_named(string $name, int $age, ...$args): array {
7+
return func_get_named_args();
8+
}
9+
10+
var_dump(hello_named(...[
11+
'age' => 30,
12+
'name' => 'John',
13+
'extra' => 'data',
14+
]));
15+
16+
var_dump(hello_named(name: 'John', age: 30, extra: 'data'));
17+
18+
var_dump(hello_named(...[
19+
'name' => 'Bob',
20+
'age' => 35,
21+
'occupation' => 'Developer',
22+
]));
23+
24+
?>
25+
--EXPECT--
26+
array(3) {
27+
["name"]=>
28+
string(4) "John"
29+
["age"]=>
30+
int(30)
31+
["extra"]=>
32+
string(4) "data"
33+
}
34+
array(3) {
35+
["name"]=>
36+
string(4) "John"
37+
["age"]=>
38+
int(30)
39+
["extra"]=>
40+
string(4) "data"
41+
}
42+
array(3) {
43+
["name"]=>
44+
string(3) "Bob"
45+
["age"]=>
46+
int(35)
47+
["occupation"]=>
48+
string(9) "Developer"
49+
}

0 commit comments

Comments
 (0)