PHP 擁有 1000+ 內置函數,但 80% 開發者只用 20%。本文精選 7 個「隱藏寶藏」函數,它們能以極少代碼解決常見棘手問題,涵蓋代碼高亮、字符串相似度、變量檢查、命令注入防護、日期驗證、源碼分析等實戰場景。
場景:技術博客、API 文檔、代碼審查工具、在線編輯器展示 PHP 代碼片段。
<?php
$code = '<?php
function factorial($n) {
return $n <= 1 ? 1 : $n * factorial($n - 1);
}
echo factorial(5); // 120
?>';
// 直接輸出高亮 HTML
highlight_string($code);
// 或返回字符串 (第二參數 true)
$highlighted = highlight_string($code, true);
echo "<pre>$highlighted</pre>";
// 自定義顏色 (需配合 ini_set)
ini_set('highlight.comment', '#999');
ini_set('highlight.default', '#333');
ini_set('highlight.html', '#06c');
ini_set('highlight.keyword', '#c00');
ini_set('highlight.string', '#080');
輸出:帶有 `` 的完整 HTML,可直接嵌入頁面。
場景:文章字數統計、SEO 關鍵詞密度分析、內容審核、閱讀時間預估。
<?php
$text = "Hello world! This is a test: PHP's str_word_count().";
// 模式 0 (默認):返回單詞數
echo str_word_count($text); // 9
// 模式 1:返回單詞數組
print_r(str_word_count($text, 1));
/*
Array
(
[0] => Hello
[1] => world
[2] => This
[3] => is
[4] => a
[5] => test
[6] => PHP
[7] => str_word_count
)
*/
// 模式 2:返回單詞及其位置索引
print_r(str_word_count($text, 2));
/*
Array
(
[0] => Hello
[6] => world
[12] => This
[17] => is
[20] => a
[22] => test
[27] => PHP
[30] => str_word_count
)
*/
// 自定義單詞字符 (支援中文需 mbstring)
$chinese = "你好世界,PHP 真強大!";
echo str_word_count($chinese, 1, '你好世界強大'); // 需列出所有中文字符,實際建議用 mb_strlen/分詞庫
場景:搜索建議「您是否要找...」、拼寫糾錯、去重相似標題、防刷檢測相似內容。
<?php
$input = "larvel"; // 用戶輸入錯誤
$candidates = ['laravel', 'lumen', 'symfony', 'codeigniter', 'yii'];
$bestMatch = null;
$minDist = PHP_INT_MAX;
foreach ($candidates as $candidate) {
$dist = levenshtein($input, $candidate);
if ($dist < $minDist) {
$minDist = $dist;
$bestMatch = $candidate;
}
}
echo "輸入: $input\n";
echo "建議: $bestMatch (距離: $minDist)";
// 輸出: 建議: laravel (距離: 1)
// 進階:自定義插入/替換/刪除成本
// levenshtein($str1, $str2, $cost_ins, $cost_rep, $cost_del)
echo levenshtein('kitten', 'sitting', 1, 2, 1); // 插入1、替換2、刪除1
場景:調試複雜上下文、模板引擎變量傳遞、序列化當前狀態、動態表單字段生成。
<?php
$user = 'admin';
$role = 'super_admin';
$permissions = ['read', 'write', 'delete'];
$token = 'abc123';
// 獲取所有局部變量
$vars = get_defined_vars();
/*
Array
(
[user] => admin
[role] => super_admin
[permissions] => Array(...)
[token] => abc123
[vars] => Array *RECURSION* // 注意:包含自身引用
)
// 實戰:自動提取模板需要的變量 (排除內部變量)
function extractTemplateVars() {
$vars = get_defined_vars();
unset($vars['_GET'], $vars['_POST'], $vars['_SERVER'], $vars['_ENV'],
$vars['_FILES'], $vars['_COOKIE'], $vars['_SESSION'],
$vars['GLOBALS'], $vars['this'], $vars['vars']);
return $vars;
}
// 模板引擎渲染時
$templateVars = extractTemplateVars();
extract($templateVars); // 變量注入當前作用域
// 模板中直接可用 $user $role $permissions...
場景:執行系統命令、調用外部工具、處理用戶輸入作為命令參數。**安全底線:絕不信任用戶輸入直接拼接命令。**
<?php
// 危險示例 (用戶輸入: test; rm -rf /)
$cmd = "convert {$_POST['input']} output.jpg"; // 命令注入!
// 正確:escapeshellcmd() 轉義命令字符串中的特殊字符
$cmd = "convert " . escapeshellcmd($_POST['input']) . " output.jpg";
// 輸入: test; rm -rf / → 輸出: test\; rm\ -rf\ /
// 更安全:escapeshellarg() 將單個參數包裹為單引號字符串
$arg = escapeshellarg($_POST['input']);
$cmd = "convert $arg output.jpg";
// 輸入: test'rm → 輸出: 'test'\''rm' (單引號包裹,內部單引號轉義)
// 組合使用:命令本體用 escapeshellcmd,參數用 escapeshellarg
$baseCmd = escapeshellcmd('/usr/bin/convert');
$arg1 = escapeshellarg($inputFile);
$arg2 = escapeshellarg($outputFile);
exec("$baseCmd $arg1 $arg2");
場景:表單生日/日期驗證、數據清洗、日曆組件邊界檢查。**自動處理閏年、大小月、年份範圍(1-32767)。**
<?php
// 基礎用法
var_dump(checkdate(2, 29, 2020)); // bool(true) 閏年
var_dump(checkdate(2, 29, 2021)); // bool(false) 平年
var_dump(checkdate(13, 1, 2020)); // bool(false) 月份超出
var_dump(checkdate(1, 32, 2020)); // bool(false) 日期超出
var_dump(checkdate(0, 1, 2020)); // bool(false) 年份超出
// 實戰:表單驗證封裝
function validateDate($year, $month, $day) {
if (!ctype_digit("$year$month$day")) return false;
return checkdate((int)$month, (int)$day, (int)$year);
}
// 批量驗證 CSV 導入數據
$rows = [
['2020', '02', '29'],
['2021', '02', '29'],
['2020', '13', '01'],
];
foreach ($rows as $row) {
echo validateDate(...$row) ? "✓" : "✗";
echo " {$row[0]}-{$row[1]}-{$row[2]}\n";
}
// ✓ 2020-02-29
// ✗ 2021-02-29
// ✗ 2020-13-01
場景:代碼統計(邏輯行 vs 註釋行)、代碼審查自動化、混淆前預處理、版本對比去噪。
<?php
// test.php
| 函數 | 核心用途 | 關鍵參數/返回值 | 實戰場景 |
|---|---|---|---|
| highlight_string | PHP 代碼高亮 | 第二參數 true 返回字符串 | 文檔、博客、審查工具 |
| str_word_count | 單詞統計/定位 | 模式 0/1/2,自定義字符集 | SEO、閱讀時間、內容審核 |
| levenshtein | 編輯距離/相似度 | 可自定義增刪改成本 | 搜索建議、去重、防刷 |
| get_defined_vars | 作用域變量快照 | 返回關聯數組,含遞歸引用 | 調試、模板變量提取 |
| escapeshellcmd/arg | 命令注入防護 | cmd 轉義字符串,arg 單引號包裹 | exec/system/popen 安全調用 |
| checkdate | 日期合法性 | 自動處理閏年/月份天數 | 表單驗證、數據清洗 |
| php_strip_whitespace | 去除註釋/空白 | 返回純代碼字符串 | 代碼統計、審查、混淆預處理 |
# 1. 瀏覽官方函數參考分類頁
https://www.php.net/manual/en/funcref.php
# 2. 針對性搜索
"php function for [your problem]"
# 3. 閱讀優秀開源項目源碼 (如 Laravel/Symfony helpers.php)
# 4. 關注 PHP 版本發布說明 (New Functions 章節)
# 5. 實踐中建立個人「常用函數速查表」
掌握這些「隱藏函數」,不僅能寫出更簡潔、安全、專業的代碼,更能在代碼審查、技術面試、架構設計中展現深厚的 PHP 內功。標準庫是最可靠、無依賴、跨版本穩定的工具箱——**好好利用它**。