1--TEST-- 2Allow trailing commas in function and method calls 3--FILE-- 4<?php 5function foo(...$args) { 6 echo __FUNCTION__ . "\n"; 7 var_dump($args); 8} 9foo( 10 'function', 11 'bar', 12); 13 14class Foo 15{ 16 public function __construct(...$args) { 17 echo __FUNCTION__ . "\n"; 18 var_dump($args); 19 } 20 21 public function bar(...$args) { 22 echo __FUNCTION__ . "\n"; 23 var_dump($args); 24 } 25 26 public function __invoke(...$args) { 27 echo __FUNCTION__ . "\n"; 28 var_dump($args); 29 } 30} 31 32$foo = new Foo( 33 'constructor', 34 'bar', 35); 36 37$foo->bar( 38 'method', 39 'bar', 40); 41 42$foo( 43 'invoke', 44 'bar', 45); 46 47$bar = function(...$args) { 48 echo __FUNCTION__ . "\n"; 49 var_dump($args); 50}; 51 52$bar( 53 'closure', 54 'bar', 55); 56 57# Make sure to hit the "not really a function" language constructs 58unset($foo, $bar,); 59var_dump(isset($foo, $bar,)); 60?> 61--EXPECT-- 62foo 63array(2) { 64 [0]=> 65 string(8) "function" 66 [1]=> 67 string(3) "bar" 68} 69__construct 70array(2) { 71 [0]=> 72 string(11) "constructor" 73 [1]=> 74 string(3) "bar" 75} 76bar 77array(2) { 78 [0]=> 79 string(6) "method" 80 [1]=> 81 string(3) "bar" 82} 83__invoke 84array(2) { 85 [0]=> 86 string(6) "invoke" 87 [1]=> 88 string(3) "bar" 89} 90{closure} 91array(2) { 92 [0]=> 93 string(7) "closure" 94 [1]=> 95 string(3) "bar" 96} 97bool(false) 98