PHP 擁有豐富的內建函數與語法糖,善用它們能大幅提升程式碼品質、執行效能與開發效率。本文精選 10 個實戰高頻技巧,涵蓋 **IP 儲存優化、郵箱驗證、資料庫現代化、三元運算、套件復用、原始碼輸出、錯誤隱藏、大字串壓縮、多值返回、魔術引號與 SQL 注入防護**,每項附完整代碼範例與避坑指南。
ip2long() / long2ip() 儲存 IPv4 為無號整數<?php
$ip = '192.168.1.100';
$long = ip2long($ip); // 3232235876 (有號整數,可能為負)
$uint = sprintf('%u', $long); // 轉無號字串 "3232235876"
// 存入 DB: INT UNSIGNED (4 bytes) vs CHAR(15) (15 bytes)
// 查詢區段: WHERE ip BETWEEN ip2long('192.168.1.0') AND ip2long('192.168.1.255')
// 反解
$ip = long2ip($uint);
?>
優勢:儲存空間減 73%、範圍查詢走索引極快、排序原生支援。注意:IPv6 需用 inet_pton()/inet_ntop() 儲存 VARBINARY(16)。
checkdnsrr() 驗證郵箱域名真實存在<?php
function isValidEmailDomain(string $email): bool {
$domain = substr(strrchr($email, '@'), 1);
if (!$domain) return false;
// 檢查 MX 記錄(郵件交換器),次選 A 記錄
return checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A');
}
// 完整驗證:格式 + 域名存在
function validateEmail(string $email): bool {
return (bool)filter_var($email, FILTER_VALIDATE_EMAIL) && isValidEmailDomain($email);
}
?>
能攔截 joeuser@wwwphp.net 此類拼寫錯誤域名。限制:僅驗證 DNS 記錄,不保證信箱真實可投遞;部分需翻牆域名可能誤判。
mysql_* 改用 mysqli_* / PDO(預處理防注入)<?php
// mysqli 預處理範例
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$stmt = $mysqli->prepare("SELECT id, name FROM users WHERE email = ? AND status = 1");
$stmt->bind_param('s', $email);
$stmt->execute();
$stmt->bind_result($id, $name);
while ($stmt->fetch()) { /* ... */ }
$stmt->close();
// PDO 範例見前文《PHP PDO 完整使用指南》
?>
核心優勢:預處理語句徹底分離代碼與數據、支援事務、物件導向介面、多驅動統一。**所有新專案嚴禁使用 mysql_*(PHP 7.0 已移除)。**
?: 與 Null 合併運算子 ??<?php
// PHP 7+ Null 合併運算子:左側存在且非 null 則取左,否則取右
$name = $_GET['name'] ?? 'Guest'; // 替代 isset($_GET['name']) ? $_GET['name'] : 'Guest'
$page = $_GET['page'] ?? 1;
$limit = $config['limit'] ?? 20;
// 三元運算子鏈式(PHP 7.0+ 左結合,建議加括號)
$status = $user->isActive ? 'active' : ($user->isBanned ? 'banned' : 'pending');
// Elvis 運算子 ?: (左側為真取左,否則取右)
$displayName = $user->nickname ?: $user->username ?: 'Anonymous';
?>
簡潔易讀,減少 if/else 巢狀。避坑:?: 判斷「真值」,?? 判斷「非 null」;0、''、false 在 ?: 會走右側,在 ?? 會保留左側。
Net_SMTP、HTTP_Request2、Cache_Lite),安裝 pear install Package_Name。composer require monolog/monolog phpmailer/phpmailer league/flysystem。highlight_file() / highlight_string() 輸出高亮原始碼<?php
// 直接輸出檔案高亮(適合文檔、除錯分享)
highlight_file(__FILE__); // 當前檔案
highlight_file('/path/to/script.php');
// 字串高亮
$code = '<?php echo "Hello"; ?>';
highlight_string($code);
// 自訂樣式(CSS 覆蓋)
// .hl-default { color: #000; }
// .hl-keyword { color: #007700; font-weight: bold; }
// .hl-string { color: #dd0000; }
// .hl-comment { color: #ff8000; }
?>
警示:分享代碼前**務必移除資料庫憑證、API Key、密碼等敏感資訊**,或用配置檔/環境變數隔離。
error_reporting(0) 生產環境隱藏錯誤細節<?php
// 入口檔案最頂端(或統一 bootstrap)
error_reporting(0); // 關閉所有錯誤顯示
ini_set('display_errors', 0); // 雙重保險
ini_set('log_errors', 1); // 開啟錯誤日誌
ini_set('error_log', '/var/log/php/error.log'); // 指定日誌路徑
// 開發環境建議
// error_reporting(E_ALL);
// ini_set('display_errors', 1);
?>
防止 SQL 語句、檔案路徑、堆疊追蹤洩露給攻擊者。**日誌必須定期輪轉、權限限制、異常告警。**
gzcompress() / gzuncompress() 壓縮大字串存入 DB (BLOB/TEXT)<?php
$longText = str_repeat('Lorem ipsum...', 1000); // ~50KB
$compressed = gzcompress($longText, 9); // 級別 9 最高壓縮,約 90% 壓縮率
// 存入 BLOB 欄位
$pdo->prepare("INSERT INTO articles (content) VALUES (?)")->execute([$compressed]);
// 讀取解壓
$row = $pdo->query("SELECT content FROM articles WHERE id=1")->fetch(PDO::FETCH_COLUMN);
$original = gzuncompress($row);
?>
適用於**不需全文搜尋**的長文本(文章內容、日誌、JSON 封存)。例外:需全文索引時勿壓縮,或用 Elasticsearch/MeiliSearch 外部索引。
& 實現函數多返回值<?php
function getUserProfile(int $uid, string &$name, string &$email, array &$roles): bool {
$row = $pdo->prepare("SELECT name, email, roles FROM users WHERE id=?")->execute([$uid])->fetch(PDO::FETCH_ASSOC);
if (!$row) return false;
$name = $row['name'];
$email = $row['email'];
$roles = json_decode($row['roles'], true);
return true;
}
// 呼叫
$name = $email = ''; $roles = [];
if (getUserProfile(1001, $name, $email, $roles)) {
echo "$name <$email> - " . implode(', ', $roles);
}
?>
配合 list() 解構(PHP 7.1+)更優雅:
function getCoords(): array { return [120.5, 23.7]; }
[$lng, $lat] = getCoords(); // 直接解構陣列,無需引用
magic_quotes_gpc 自動對 $_GET/POST/COOKIE 加反斜線,**PHP 5.4 已移除**,舊代碼需 stripslashes_deep() 清理。magic_quotes_gpc(PHP 5.4+ 預設關閉)。? 或 :name 佔位符。mysql_query\(.*\$、\.query\(.*\$ 等拼接模式。這 10 項技巧涵蓋 **資料型別優化、驗證邏輯、現代資料庫介面、語法糖、套件生態、除錯輸出、生產環境安全、儲存壓縮、函數設計模式、核心安全觀念**。內化並貫徹落實於日常開發,能讓你的 PHP 代碼更精簡、更安全、更高效、更易維護。記住:**最好的代碼是刪掉的代碼(用成熟套件替代),最安全的查詢是預處理,最快的儲存是壓縮後的整數。**