函式是結構化程式設計的基石,PHP 提供了豐富的內建函式庫,並支援使用者自訂函式、匿名函式、箭頭函式等現代特性。本文從基礎語法切入,深入探討參數傳遞機制、返回值處理、變數函式、引用返回等進階主題,並整理常用核心函式庫分類索引。
function functionName($param1, $param2 = 'default') {
// 函式主體
return $result;
}
// 呼叫
$result = functionName('arg1', 'arg2');
__ 開頭(保留給魔術方法)| 傳遞方式 | 語法 | 行為 | 適用場景 |
|---|---|---|---|
| **傳值** (預設) | function foo($arg) | 複製值到區域變數,函式內修改不影響外部 | 純資料處理、不可變資料 |
| **傳址** (引用) | function foo(&$arg) | 傳遞記憶體位址,函式內修改直接影響外部變數 | 需修改外部變數、大型陣列/物件避免複製開銷 |
| **預設參數** | function foo($arg = 'default') | 呼叫時可省略,預設值必須是常數表達式 | 選擇性參數、向後相容 |
| **可變參數** (PHP 5.6+) | function foo(...$args) | 接收任意數量參數為陣列 | 不定參數函式、中介軟體 |
| **解包參數** (PHP 5.6+) | foo(...$arr) | 將陣列展開為參數列表 | 動態呼叫、參數轉發 |
function addPrefix(&$str, $prefix = 'PRE_') {
$str = $prefix . $str;
}
$name = 'John';
addPrefix($name);
echo $name; // PRE_John
// 錯誤
function foo($a = 1, $b) {}
// 正確
function foo($a, $b = 1) {}
function sum($a, $b) {
return $a + $b; // 返回單一值
}
list() 解包function stats($arr) {
return ['sum' => array_sum($arr), 'count' => count($arr)];
}
['sum' => $s, 'count' => $c] = stats([1,2,3]); // PHP 7.1+ 解包語法
return 的流程控制效果exit)include 檔案中:返回值給 include 運算式,並停止該檔案執行透過變數名稱動態呼叫函式。
function sayHello() { echo "Hello\n"; }
function sayBye() { echo "Bye\n"; }
$func = 'sayHello';
$func(); // Hello
$func = 'sayBye';
$func(); // Bye
應用:回調函式、策略模式、路由分發。
$greet = function($name) { return "Hello, $name"; };
echo $greet('World'); // Hello, World
// 綁定外部變數
$prefix = 'Mr. ';
$greet = function($name) use ($prefix) { return $prefix . $name; };
$mul = fn($x, $y) => $x * $y;
echo $mul(3, 4); // 12
// 隱含 use 綁定外部變數
$factor = 10;
$scale = fn($x) => $x * $factor;
function &getConfig() {
static $config = ['debug' => true];
return $config;
}
$cfg = &getConfig();
$cfg['debug'] = false; // 修改靜態變數
用途:單例模式、快取存取、大型資料結構避免複製。
unset()僅斷開變數名稱與值的綁定,不銷毀值本身(引用計數機制)。
| 分類 | 常用函式 | 說明 |
|---|---|---|
| **變數處理** | isset(), empty(), gettype(), var_dump(), is_array(), is_numeric() | 型別檢查、變數狀態判斷 |
| **字串操作** | strlen(), substr(), strpos(), str_replace(), explode(), implode(), trim(), sprintf() | 搜尋、替換、分割、格式化 |
| **日期時間** | date(), time(), strtotime(), mktime(), DateTime 類別 | 格式化、運算、時區處理 |
| **數學運算** | rand(), mt_rand(), round(), floor(), ceil(), abs(), fmod() | 隨機數、取整、浮點數餘數 |
| **檔案系統** | fopen(), file_get_contents(), file_put_contents(), mkdir(), unlink(), glob() | 讀寫、目錄操作、路徑處理 |
| **陣列操作** | array_merge(), array_map(), array_filter(), array_reduce(), array_keys(), in_array() | 合併、轉換、過濾、聚合、查找 |
| **資料庫 (MySQLi/PDO)** | mysqli_connect(), PDO::__construct(), prepare(), execute(), fetchAll() | 預處理語句、交易控制、防注入 |
namespace App\Utils; 避免全域污染。function add(int $a, int $b): int 提升可讀性與 IDE 支援。declare(strict_types=1); 強制型別檢查。熟練掌握 PHP 函式的定義、參數機制、返回值處理與進階特性,能讓您寫出更模組化、可測試、可維護的程式碼。善用型別宣告、匿名函式與現代語法糖,是邁向專業 PHP 開發者的關鍵一步。