良好的函數設計能大幅提升代碼可維護性與健壯性。本文整理命名規範、參數驗證、靜態變數應用、引用陷阱等實戰經驗,助你寫出專業級函數。
| 前綴 | 用途 | 範例 |
|---|---|---|
| str_ | 字串處理 | str_cut_utf8() |
| arr_ | 陣列操作 | arr_merge_unique() |
| bool_ | 布林判斷 | bool_is_mobile() |
| db_ | 資料庫相關 | db_get_user() |
| fmt_ | 格式化輸出 | fmt_price() |
| val_ | 驗證檢查 | val_email() |
| util_ | 通用工具 | util_curl_get() |
: array、: string、: ?int/**
* 安全截取 UTF-8 字串,支援中文
* @param string $str 輸入字串
* @param int $width 截取字元數(非位元組)
* @param string $suffix 截斷後綴
* @return string
*/
function str_cut_utf8(string $str, int $width = 0, string $suffix = '...'): string {
// 1. 參數驗證
if ($str === '' || $width <= 0) return $str;
// 2. 不修改原參數
$width = (int)$width;
// 3. 核心邏輯
$result = mb_strcut($str, 0, $width, 'UTF-8');
// 4. 兜底處理
if ($result === false || $result === '') return $str;
return $result . $suffix;
}
// 測試
echo str_cut_utf8('我是開發者', 4); // 我是開...
echo str_cut_utf8('hello world', 5); // hello...
echo str_cut_utf8('', 10); // (空字串)
echo str_cut_utf8('test', -1); // test
function counter() {
static $count = 0; // 僅初始化一次
return ++$count;
}
echo counter(); // 1
echo counter(); // 2
echo counter(); // 3
// 實用場景:單例模式、快取、避免重複初始化
function get_db_config() {
static $config = null;
if ($config === null) {
$config = parse_ini_file('/etc/app/db.ini');
}
return $config;
}
function modify(&$val) {
$val *= 2;
}
$a = 5;
modify($a);
echo $a; // 10 (原變數被修改)
// 危險範例:回傳引用
function &get_ref() {
static $x = 0;
return $x;
}
$ref = &get_ref();
$ref = 100;
echo get_ref(); // 100 (靜態變數被外部修改)
警告: PHP 5.3+ 棄用呼叫時傳址
call_user_func('func', &$var),PHP 7+ 移除。現代寫法請在函數定義處宣告參考function(&$param)。
// PHP 5.6+ 寫法
function sum(...$numbers) {
return array_sum($numbers);
}
echo sum(1,2,3,4,5); // 15
// 舊版相容寫法
function sum_legacy() {
return array_sum(func_get_args());
}
MY_FUNC()(易與常數混淆)add($a,$b) 包裝 $a+$bmysql_query() 不檢查返回值function (int $id, string $name): array