Java 中遞歸調用只需在基例返回值,調用鏈會自動層層返回。PHP **必須在每一層遞歸調用前顯式寫 return**,否則返回值丟失,函數隱式返回 null。
<?php
function TestReturn($i) {
if ($i < 3) {
$i++;
TestReturn($i); // 缺失 return!
}
return $i;
}
var_dump(TestReturn(1)); // 輸出 int(3) ?錯!實際輸出 int(1)
執行流程:
TestReturn(1) → 遞歸調用 TestReturn(2) → 遞歸調用 TestReturn(3) → 滿足條件返回 3 → **上一層未接收返回值,繼續執行 return $i(此時 $i=2)** → 再上一層同理返回 1。
<?php
function TestReturn($i) {
if ($i < 3) {
$i++;
return TestReturn($i); // 關鍵:必須 return
}
return $i;
}
var_dump(TestReturn(1)); // 正確輸出 int(3)
return 時,調用表達式值為 null,隨即丟棄;<?php
// 查找數組中首個滿足條件的元素
function findFirst($arr, $predicate, $index = 0) {
if ($index >= count($arr)) return null;
if ($predicate($arr[$index])) return $arr[$index];
return findFirst($arr, $predicate, $index + 1); // 必須 return
}
// 斐波那契(教學用,實際請用迭代/備忘錄)
function fib($n) {
if ($n <= 1) return $n;
return fib($n - 1) + fib($n - 2); // 兩處遞歸均需 return
}
return?return 值?return func(...)?while/for)消除遞歸風險。這是 PHP 從過程式語言演變而來的歷史包袱,也是新手從 Java 轉 PHP 最易踩的坑之一。養成「遞歸必寫 return」肌肉記憶,省去無數調試時間。