首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 隱藏寶藏函數:7 個鮮為人知但極其實用的內置函數實戰指南

     編輯:PHP 綜合知識

挖掘 PHP 標準庫金礦:7 個高價值、低知名度內置函數深度解析

PHP 擁有 1000+ 內置函數,但 80% 開發者只用 20%。本文精選 7 個「隱藏寶藏」函數,它們能以極少代碼解決常見棘手問題,涵蓋代碼高亮、字符串相似度、變量檢查、命令注入防護、日期驗證、源碼分析等實戰場景。

1. highlight_string() —— 代碼高亮輸出神器

場景:技術博客、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,可直接嵌入頁面。

2. str_word_count() —— 智能單詞統計

場景:文章字數統計、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/分詞庫

3. levenshtein() —— 字符串編輯距離 (模糊匹配核心)

場景:搜索建議「您是否要找...」、拼寫糾錯、去重相似標題、防刷檢測相似內容。

<?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

4. get_defined_vars() —— 當前作用域所有變量快照

場景:調試複雜上下文、模板引擎變量傳遞、序列化當前狀態、動態表單字段生成。

<?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...

5. escapeshellcmd() / escapeshellarg() —— 命令注入防護雙劍

場景:執行系統命令、調用外部工具、處理用戶輸入作為命令參數。**安全底線:絕不信任用戶輸入直接拼接命令。**

<?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");

6. checkdate() —— 日期合法性驗證 (含閏年邏輯)

場景:表單生日/日期驗證、數據清洗、日曆組件邊界檢查。**自動處理閏年、大小月、年份範圍(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

7. php_strip_whitespace() —— 源碼純淨度分析

場景:代碼統計(邏輯行 vs 註釋行)、代碼審查自動化、混淆前預處理、版本對比去噪。

<?php
// test.php

函數速查總結表

函數核心用途關鍵參數/返回值實戰場景
highlight_stringPHP 代碼高亮第二參數 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 內功。標準庫是最可靠、無依賴、跨版本穩定的工具箱——**好好利用它**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved