- 实现变长参数语法解析和编译支持 - 添加变长参数必须位于最后位置的验证逻辑 - 支持变长参数不能通过引用传递的限制检查 - 实现变长参数默认值作为空数组的处理机制 - 添加对变长参数函数调用时参数数量的检查功能 - 支持除法运算符返回类型推断的特殊情况处理 - 优化函数调用参数解析中的变长参数展开逻辑 - 添加多个变长参数函数测试用例覆盖不同场景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