- 实现变长参数语法解析和编译支持 - 添加变长参数必须位于最后位置的验证逻辑 - 支持变长参数不能通过引用传递的限制检查 - 实现变长参数默认值作为空数组的处理机制 - 添加对变长参数函数调用时参数数量的检查功能 - 支持除法运算符返回类型推断的特殊情况处理 - 优化函数调用参数解析中的变长参数展开逻辑 - 添加多个变长参数函数测试用例覆盖不同场景pull/1/head
parent
096a92a62e
commit
07200b9e12
7 changed files with 204 additions and 9 deletions
@ -0,0 +1,40 @@ |
|||||||
|
--TEST-- |
||||||
|
Variadic Functions - Variable number of arguments with ... |
||||||
|
--SKIPIF-- |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
// Test variadic in class methods |
||||||
|
class Calculator { |
||||||
|
public function add(...$values): int { |
||||||
|
return array_sum($values); |
||||||
|
} |
||||||
|
|
||||||
|
public function average(...$values): float { |
||||||
|
if (count($values) === 0) { |
||||||
|
return 0.0; |
||||||
|
} |
||||||
|
return array_sum($values) / count($values); |
||||||
|
} |
||||||
|
|
||||||
|
public static function max(...$values): mixed { |
||||||
|
if (empty($values)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return max($values); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
|
||||||
|
// Test variadic in class methods |
||||||
|
$calc = new Calculator(); |
||||||
|
var_dump($calc->add(1, 2, 3, 4)); |
||||||
|
var_dump($calc->average(13, 14, 17, 26)); |
||||||
|
var_dump(Calculator::max(5, 15, 10, 20)); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
int(10) |
||||||
|
float(17.5) |
||||||
|
int(20) |
||||||
@ -0,0 +1,56 @@ |
|||||||
|
--TEST-- |
||||||
|
Variadic Functions - Variable number of arguments with ... |
||||||
|
--SKIPIF-- |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
// Test combining variadic with type hints |
||||||
|
function concat_strings(string ...$strings): string { |
||||||
|
return implode('', $strings); |
||||||
|
} |
||||||
|
|
||||||
|
// Test variadic returning array |
||||||
|
function filter_positive(int ...$numbers): array { |
||||||
|
return array_filter($numbers, fn($n) => $n > 0); |
||||||
|
} |
||||||
|
|
||||||
|
// Test variadic with reference (should fail gracefully) |
||||||
|
function test_by_reference(...$params) { |
||||||
|
foreach ($params as &$param) { |
||||||
|
$param *= 2; |
||||||
|
} |
||||||
|
return $params; |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
// Test combining variadic with type hints |
||||||
|
var_dump(concat_strings("Hello", " ", "World", "!")); |
||||||
|
var_dump(concat_strings("PHP", "AOT")); |
||||||
|
|
||||||
|
// Test variadic returning array |
||||||
|
var_dump(filter_positive(1, -2, 3, -4, 5)); |
||||||
|
|
||||||
|
// Test variadic with reference |
||||||
|
$values = [1, 2, 3]; |
||||||
|
var_dump(test_by_reference(...$values)); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
string(12) "Hello World!" |
||||||
|
string(6) "PHPAOT" |
||||||
|
array(3) { |
||||||
|
[0]=> |
||||||
|
int(1) |
||||||
|
[2]=> |
||||||
|
int(3) |
||||||
|
[4]=> |
||||||
|
int(5) |
||||||
|
} |
||||||
|
array(3) { |
||||||
|
[0]=> |
||||||
|
int(2) |
||||||
|
[1]=> |
||||||
|
int(4) |
||||||
|
[2]=> |
||||||
|
int(6) |
||||||
|
} |
||||||
@ -0,0 +1,26 @@ |
|||||||
|
--TEST-- |
||||||
|
sum |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
|
||||||
|
// Test variadic with required parameters |
||||||
|
function multiply($multiplier, ...$numbers): int { |
||||||
|
$result = 1; |
||||||
|
foreach ($numbers as $num) { |
||||||
|
$result *= $num; |
||||||
|
} |
||||||
|
return $result * $multiplier; |
||||||
|
} |
||||||
|
|
||||||
|
function main() |
||||||
|
{ |
||||||
|
// Test variadic with required parameters |
||||||
|
var_dump(multiply(2, 3, 4)); // 2 * 3 * 4 = 24 |
||||||
|
var_dump(multiply(10, 5)); // 10 * 5 = 50 |
||||||
|
var_dump(multiply(7)); // 7 (no additional numbers) |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
int(24) |
||||||
|
int(50) |
||||||
|
int(7) |
||||||
@ -0,0 +1,39 @@ |
|||||||
|
--TEST-- |
||||||
|
sum |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
// Test basic variadic function |
||||||
|
function sum(...$numbers): int { |
||||||
|
return array_sum($numbers); |
||||||
|
} |
||||||
|
|
||||||
|
function test_unpacking() { |
||||||
|
$numbers = [1, 2, 3, 4]; |
||||||
|
var_dump(sum(...$numbers)); |
||||||
|
|
||||||
|
$args = [10, 20, 30, 40, 50]; |
||||||
|
var_dump(sum(...$args)); |
||||||
|
|
||||||
|
// Unpack multiple arrays |
||||||
|
$arr1 = [1, 2]; |
||||||
|
$arr2 = [3, 4]; |
||||||
|
var_dump(sum(...$arr1, ...$arr2)); |
||||||
|
} |
||||||
|
|
||||||
|
function main() |
||||||
|
{ |
||||||
|
var_dump(sum(1, 2, 3, 4, 5)); |
||||||
|
var_dump(sum(10, 20, 30)); |
||||||
|
var_dump(sum()); |
||||||
|
|
||||||
|
// Test unpacking arrays into variadic functions |
||||||
|
test_unpacking(); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
int(15) |
||||||
|
int(60) |
||||||
|
int(0) |
||||||
|
int(10) |
||||||
|
int(150) |
||||||
|
int(10) |
||||||
Loading…
Reference in new issue