萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 自定義函數完整教學:定義、參數、預設值、回傳與變數函數

PHP 使用者自定義函數詳細指南

PHP 超過 700 種內建函數外,開發者可自訂函數封裝邏輯,提升程式碼複用性、可讀性與可測試性。

基本語法

<?php
function functionName($param1, $param2 = 'default') {
    // 函數主體
    return $result; // 可選
}
?>
  • 關鍵字 function 開頭。
  • 函數名:字母/底線開頭,區分大小寫 (慣例用 camelCase 或 snake_case)。
  • { } 包裹主體。
  • return 結束執行並回傳值;無 return 或 return; 則回傳 null。

建立與呼叫範例

<?php
function writeMyName() {
    echo 'David Yang';
}

echo 'Hello world!
'; echo 'My name is '; writeMyName(); // 輸出 David Yang echo '.
That\'s right, '; writeMyName(); echo ' is my name.'; ?>

輸出:

Hello world!
My name is David Yang.
That's right, David Yang is my name.

參數傳遞

位置參數

<?php
function cityName($city) {
    echo '城市名稱為:' . $city;
}
cityName('Shanghai'); // 城市名稱為:Shanghai
?>

預設參數值 (PHP 5+)

<?php
function cityName($city = 'Beijing') {
    echo '城市名稱為:' . $city;
}
cityName();          // 城市名稱為:Beijing
cityName('Shanghai'); // 城市名稱為:Shanghai
?>
  • 預設值必須是**常數運算式** (標量、陣列、null、常數),不能是變數或函數呼叫。
  • 預設參數必須在**非預設參數之後**。

傳址參數 (Reference)

<?php
function addPrefix(&$str, $prefix = 'Mr. ') {
    $str = $prefix . $str;
}
$name = 'John';
addPrefix($name);
echo $name; // Mr. John
?>
  • 函數定義時參數前加 & 表示傳址,呼叫端**不加** & (PHP 5.4+ 呼叫端加 & 已棄用)。
  • 允許函數修改呼叫端變數值。

可變參數 (Variadic, PHP 5.6+)

<?php
function sum(...$numbers) {
    return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 10
$arr = [5, 6, 7];
echo sum(...$arr); // 18 (解包陣列)
?>

型別宣告與回傳型別 (PHP 7.0+)

<?php
function add(int $a, int $b): int {
    return $a + $b;
}
echo add(1, 2); // 3
// add(1.5, 2); // TypeError (嚴格模式)
?>
  • 支援 int、float、string、bool、array、callable、iterable、類別/介面名稱。
  • 啟用嚴格模式:檔案最頂端 declare(strict_types=1);。

變數函數與匿名函數

<?php
// 變數函數:變數值為函數名稱字串
function foo() { echo 'FOO'; }
$func = 'foo';
$func(); // 呼叫 foo()

// 匿名函數 (Closure) 指派給變數
$greet = function($name) { return "Hello $name"; };
echo $greet('World'); // Hello World

// 箭頭函數 (PHP 7.4+)
$double = fn($x) => $x * 2;
echo $double(5); // 10
?>

遞迴函數

<?php
function factorial(int $n): int {
    return $n <= 1 ? 1 : $n * factorial($n - 1);
}
echo factorial(5); // 120
?>

函數存在性檢查

<?php
if (function_exists('json_encode')) {
    echo json_encode(['a' => 1]);
}
?>

最佳實踐建議

  1. **單一職責**:一個函數只做一件事。
  2. **命名語意化**:動詞開頭 (getUser, calculateTotal, isValid)。
  3. **參數少於 3-4 個**;過多請用關聯陣列或 DTO 物件。
  4. **避免副作用**:純函數 (相同輸入必得相同輸出、無外部狀態變更) 易測試。
  5. **文件化**:使用 PHPDoc 註解 (/** @param int $id @return User|null */)。
  6. **錯誤處理**:拋出具體 Exception,而非回傳 false/混合型別。
copyright © 萬盛學電腦網 all rights reserved