函數是 PHP 程式設計中實現程式碼重用與模組化的核心機制。本文系統整理了 PHP 函數的定義、參數傳遞、變數作用域、返回值、遞迴、變數函數等核心概念,並附上實戰範例幫助開發者快速掌握。
PHP 允許開發者定義自己的函數,語法結構如下:
function 函數名稱([$參數1[, $參數2[, ...]]]) {
// 函數主體程式碼
}
注意:函數名稱不可與內建函數或已定義的使用者函數重複。參數個數可為零個或多個,預設以「傳值」方式傳遞。
預設情況下,參數以「傳值」方式傳入,函數內部修改參數不會影響外部變數。若需在函數內修改外部變數,必須使用「傳址」方式,在參數前加上 & 符號:
<?php
function color(&$col) {
$col = "yellow";
}
$blue = "blue";
color($blue);
echo $blue; // 輸出 "yellow"
?>
PHP 採用區域作用域規則:
<?php
function sum() {
$count = 2; // 區域變數
}
sum();
echo $count; // 錯誤:$count 未定義
?>
若需在函數內使用全域變數,可使用 global 關鍵字或 $GLOBALS 陣列。
使用 return 語句可立即結束函數執行並返回值。返回值型別不限,可為標量、陣列、物件等任意型別。
<?php
function my_function($a = 1) {
echo $a;
return; // 結束函數,後續程式碼不執行
$a++;
echo $a;
}
my_function(); // 輸出 1
?>
函數定義後即可呼叫。若函數有返回值,可將其指派給變數;若無返回值,直接呼叫函數名稱即可。
<?php
// 陣列升序排序函數
function my_sort($array) {
for ($i = 0; $i < count($array); $i++) {
for ($j = $i + 1; $j < count($array); $j++) {
if ($array[$i] > $array[$j]) {
$tmp = $array[$j];
$array[$j] = $array[$i];
$array[$i] = $tmp;
}
}
}
return $array;
}
$arr = array(6, 4, 7, 5, 9, 2);
$sort_arr = my_sort($arr);
foreach ($sort_arr as $num) echo $num; // 輸出 245679
?>
PHP 支援遞迴函數(函數呼叫自身),可用於實現階乘、樹狀結構遍歷等邏輯。必須設定終止條件,否則會導致無限遞迴耗盡記憶體。
<?php
function factorial($n) {
if ($n == 0) return 1;
else return $n * factorial($n - 1);
}
echo factorial(10); // 輸出 3628800
?>
PHP 允許將函數名稱儲存在變數中,透過在變數後加上括號 () 即可呼叫該函數,實現動態函數呼叫。
$func_name = 'my_function';
$func_name(); // 等同於呼叫 my_function()
結合 HTML 表單與 PHP 函數實作基本四則運算,包含輸入驗證與除零錯誤處理:
<html>
<head><title>計算機程式</title></head>
<body>
<form method="post">
<table>
<tr><td>
<input type="text" size="4" name="number1">
<select name="calculate">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" size="4" name="number2">
<input type="submit" name="ok" value="計算">
</td></tr>
</table>
</form>
</body>
</html>
<?php
function cac($a, $b, $calculate) {
if ($calculate == "+") return $a + $b;
if ($calculate == "-") return $a - $b;
if ($calculate == "*") return $a * $b;
if ($calculate == "/") {
if ($b == "0") echo "除數不能等於0";
else return $a / $b;
}
}
if (isset($_POST['ok'])) {
$number1 = $_POST['number1'];
$number2 = $_POST['number2'];
$calculate = $_POST['calculate'];
if (is_numeric($number1) && is_numeric($number2)) {
$answer = cac($number1, $number2, $calculate);
echo "<script>alert('" . $number1 . $calculate . $number2 . "=" . $answer . "')</script>";
} else {
echo "<script>alert('輸入的不是數字!')</script>";
}
}
?>