feat(php): 添加对引用参数默认值的错误检查

- 在编译器基础类中添加了对引用参数默认值的支持检查
- 当检测到引用参数具有默认值时抛出致命错误
- 添加了深度递归测试文件以验证递归函数功能
- 测试包含阶乘、斐波那契、相互递归和树形递归等场景
- 验证了分治算法如快速排序的递归实现
pull/1/head
韩天峰 5 months ago
parent ced53b63be
commit 3eaca2c359
  1. 3
      src/Php/CompilerBase.php
  2. 137
      tests/aot/deep-recursion.phpt

@ -1023,6 +1023,9 @@ class CompilerBase extends \PhpAot\Core\Translator
$argInfo->nullable = true;
}
if ($param->default) {
if ($param->byRef) {
$this->fatalError($param, 'Default value for parameters passed by reference is not supported');
}
$defaultValueCount++;
$argInfo->default = $this->parseParamDefaultValue($param->default);
$argInfo->defaultValue = $param->default;

@ -0,0 +1,137 @@
--TEST--
Deep Recursion Test
--FILE--
<?php
// Test deep recursion with factorial
function factorial(int $n): int {
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
// Test fibonacci with memoization
function fib(int $n, array &$memo): int {
if ($n <= 1) {
return 1;
}
if (isset($memo[$n])) {
return $memo[$n];
}
$result = fib($n - 1, $memo) + fib($n - 2, $memo);
$memo[$n] = $result;
return $result;
}
// Test mutual recursion
function isEven(int $n): bool {
if ($n === 0) {
return true;
}
return isOdd($n - 1);
}
function isOdd(int $n): bool {
if ($n === 0) {
return false;
}
return isEven($n - 1);
}
// Test tree recursion
function sumTree(array $tree): int {
$sum = $tree['value'];
foreach ($tree['children'] ?? [] as $child) {
$sum += sumTree($child);
}
return $sum;
}
// Test quicksort (divide and conquer)
function quicksort(array $arr): array {
if (count($arr) <= 1) {
return $arr;
}
$pivot = $arr[0];
$left = [];
$right = [];
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] < $pivot) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
return array_merge(quicksort($left), [$pivot], quicksort($right));
}
function main() {
var_dump(factorial(5));
var_dump(factorial(10));
$memo = [];
var_dump(fib(10, $memo));
var_dump(fib(15, $memo));
var_dump(isEven(10));
var_dump(isOdd(10));
var_dump(isEven(7));
var_dump(isOdd(7));
$tree = [
'value' => 1,
'children' => [
[
'value' => 2,
'children' => [
['value' => 4, 'children' => []],
['value' => 5, 'children' => []],
],
],
[
'value' => 3,
'children' => [
['value' => 6, 'children' => []],
],
],
],
];
var_dump(sumTree($tree));
$unsorted = [3, 6, 1, 5, 2, 4];
var_dump(quicksort($unsorted));
}
?>
--EXPECT--
int(120)
int(3628800)
int(89)
int(987)
bool(true)
bool(false)
bool(false)
bool(true)
int(21)
array(6) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(6)
}
Loading…
Cancel
Save