技巧一:四捨五入取整的優雅寫法
// 傳統寫法
if ($a - intval($a) >= 0.5) $a = intval($a) + 1;
// 一行解決:利用正負號調整
$a = intval($a + 0.5 * ($a > 0 ? 1 : -1));
// 保留 n 位小數
function round_precision($val, $precision = 2) {
$factor = 10 ** $precision;
return intval($val * $factor + 0.5 * ($val > 0 ? 1 : -1)) / $factor;
}
技巧二:非負數截取的簡潔表達
// if ($a - $b < 0) $result = 0; else $result = $a - $b;
// 一行:
$result = max(0, $a - $b);
技巧三:CSV 格式處理大數據導入
// fgetcsv 自動處理引號、換行、分隔符
$handle = fopen('data.csv', 'r');
while (($row = fgetcsv($handle)) !== false) {
// $row 為數組,直接入庫
}
fclose($handle);
技巧四:字符串替換優先用 str_replace
- `str_replace()` 比 `preg_replace()` 快 **61%+** (官方基準測試)
- 無正則需求時**絕不**使用正則函數
- 批量替換:`str_replace(['a','b'], ['A','B'], $str)`
技巧五:布爾判斷簡化
// if ($a == true) → if ($a)
// if ($a == false) → if (!$a)
// 三目運算優先
$status = $active ? '啟用' : '禁用';
技巧六:isset() 性能優於 array_key_exists()
- `isset($arr['key'])` 為語言構造器,極快
- 但 `isset` 返回 false 當值為 null,需區分時用 `array_key_exists`
技巧七:善用三目/Null 合併運算符
// PHP 7.0+ Null 合併
$name = $user['name'] ?? '遊客';
// PHP 7.4+ Null 合併賦值
$user['nickname'] ??= $user['name'];
// 鏈式安全訪問 (PHP 8.0+)
$city = $user?->address?->city ?? '未知';
技巧八:早返回減少巢狀層級
// 壞味道:箭頭代碼
function process($data) {
if ($data) {
if (validate($data)) {
if (save($data)) {
return true;
}
}
}
return false;
}
// 好風格:守衛子句
function process($data) {
if (!$data) return false;
if (!validate($data)) return false;
if (!save($data)) return false;
return true;
}
技巧九:引入緩存層降低 DB 壓力
// Redis 緩存包裝
function getUser($id) {
$key = "user:$id";
if ($data = Redis::get($key)) return json_decode($data, true);
$data = DB::table('users')->find($id);
if ($data) Redis::setex($key, 3600, json_encode($data));
return $data;
}
技巧十:輕量級 SQLite 存儲臨時數據
// 無需 MySQL 服務,文件型數據庫
$db = new PDO('sqlite:/tmp/cache.db');
$db->exec("CREATE TABLE IF NOT EXISTS temp (key TEXT PRIMARY KEY, value TEXT, expire INT)");
// 寫入
$stmt = $db->prepare("INSERT OR REPLACE INTO temp VALUES (?, ?, ?)");
$stmt->execute(['token_123', 'abc', time() + 3600]);
// 讀取並清理過期
$stmt = $db->prepare("SELECT value FROM temp WHERE key = ? AND expire > ?");
$stmt->execute(['token_123', time()]);
$token = $stmt->fetchColumn();
總結:高質量 PHP 代碼原則
- 簡潔:利用語法糖減少樣板代碼
- 性能:選擇正確函數、引入緩存、避免 N+1 查詢
- 安全:預處理語句、輸入驗證、輸出轉義
- 可讀:早返回、有意義命名、類型聲明
- 現代:PHP 8.1+ 新特性、PSR 標準、靜態分析