函數是 PHP 代碼復用的基本單元。本文通過三個漸進式範例,深度講解遞歸邏輯、return 與 echo 的本質差異、變量作用域隔離,並給出現代 PHP 函數設計最佳實踐。
$data = [
0 => 'apple', 1 => 'banana', 2 => 'cat',
3 => 'dog', 4 => 'egg', 5 => 'father'
];
function filterArray(array $arr, string $target): array {
$result = []; // 局部變量,不影響外部
foreach ($arr as $key => $value) {
if ($value === $target) {
$result[] = [$key => $value];
}
}
return $result; // 返回陣列,函數即表達式
}
// 調用
print_r(filterArray($data, 'banana'));
/*
Array
(
[0] => Array
(
[1] => banana
)
)
*/
關鍵點:
return 結束函數執行,後續代碼不再運行。function buildList(array $arr, array $targets): string {
$html = '';
foreach ($arr as $value) {
// 雙層迴圈 = 遞歸過濾邏輯
foreach ($targets as $target) {
if ($value === $target) {
$html .= "- $value
";
}
}
}
$html .= '
';
return $html; // 返回字串
}
// 調用
$targets = ['apple', 'father'];
echo buildList($data, $targets); // 輸出 HTML
遞歸概念澄清:此處「雙層迴圈過濾」非嚴格遞歸(函數自我調用),實為**巢狀迭代**。真正遞歸範例:
function factorial(int $n): int {
return $n <= 1 ? 1 : $n * factorial($n - 1); // 函數呼叫自身
}
function printList(array $arr, array $targets): void {
echo '';
foreach ($arr as $value) {
foreach ($targets as $target) {
if ($value === $target) {
echo "- $value
";
}
}
}
echo '
';
// 無 return,隱式返回 null
}
// 調用
printList($data, ['apple', 'father']); // 直接輸出,無需 echo
| 維度 | return | echo |
|---|---|---|
| 本質 | 將值返回給調用者(函數即表達式) | 直接輸出到輸出緩衝區(語言構造,非函數) |
| 可組合性 | 高:可賦值、傳參、嵌套、鏈式 | 低:執行即輸出,難以捕獲、測試、復用 |
| 測試性 | 易:斷言返回值 | 難:需捕獲輸出緩衝區 (ob_start) |
| 職責分離 | 符合:邏輯與輸出分離 | 違反:混合業務邏輯與 I/O |
| 效能 | 微弱優勢(避免輸出緩衝鎖) | 大量輸出時需手動 flush |