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

PHP 9 個必知必會的進階特性與實用函數

     編輯:PHP 綜合知識

1. 可變參數函數:func_get_args() / ... 操作符

PHP 5.6+ 推薦使用 ... 語法,更優雅:

<?php
// 現代寫法(PHP 5.6+)
function sum(...$numbers) {
    return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 10

// 兼容舊版
function sum_legacy() {
    return array_sum(func_get_args());
}
?>

應用場景:日誌封裝、數據庫查詢構建器、通用工具函數。

2. glob() 文件模式匹配:比 scandir() 更強大

<?php
// 獲取所有 PHP 文件
$phpFiles = glob('*.php');

// 多模式匹配(需 GLOB_BRACE)
$files = glob('*.{php,js,css}', GLOB_BRACE);

// 遞歸查找(PHP 5.5+ 需配合 RecursiveDirectoryIterator)
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('.')
);
$phpFiles = new RegexIterator($iterator, '/\.php$/i');

技巧:array_map('realpath', glob('...')) 獲取絕對路徑。

3. 內存監控:memory_get_usage() / memory_get_peak_usage()

<?php
echo "初始: " . memory_get_usage() . " bytes\n"; // ~360KB

// 模擬大數據處理
$data = [];
for ($i = 0; $i < 100000; $i++) {
    $data[] = md5($i);
}
echo "峰值: " . memory_get_peak_usage() . " bytes\n"; // ~13MB

// 釋放內存
unset($data);
echo "釋放後: " . memory_get_usage() . " bytes\n"; // ~880KB

實戰用途:長時間運行腳本(隊列消費者、數據遷移)內存洩漏監控、OOM 預警。

4. CPU 使用分析:getrusage()(僅 Linux/Unix)

<?php
// 計算用戶態/系統態 CPU 時間
function get_cpu_usage() {
    $ru = getrusage();
    $user = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
    $sys  = $ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec'] / 1e6;
    return ['user' => $user, 'sys' => $sys, 'total' => $user + $sys];
}

// 基準測試
$start = get_cpu_usage();
// ... 執行代碼 ...
$end = get_cpu_usage();
echo "用戶態: " . ($end['user'] - $start['user']) . "s\n";
echo "系統態: " . ($end['sys'] - $start['sys']) . "s\n";

關鍵指標:ru_nvcsw(主動上下文切換)、ru_nivcsw(被動切換)、ru_minflt/ru_majflt(頁錯誤)。

5. 魔術常量:__LINE__、__FILE__、__DIR__、__FUNCTION__、__CLASS__、__METHOD__、__NAMESPACE__

<?php
// 安全引用同目錄文件(不受工作目錄影響)
require_once __DIR__ . '/config/database.php';

// 調試輸出行號
function debug($msg) {
    echo "[LINE " . __LINE__ . "] $msg\n";
}
debug('開始處理'); // 輸出實際行號

6. 生成唯一 ID:uniqid() 替代 md5(time().rand())

<?php
echo uniqid();           // 5f3a1b2c3d4e5 (微秒級,可排序)
echo uniqid('order_');   // order_5f3a1b2c3d4e5 (帶前綴)
echo uniqid('', true);   // 5f3a1b2c3d4e5.12345678 (更多熵)
echo uniqid('token_', true); // token_5f3a1b2c3d4e5.12345678

// 對比:md5 32 字符,uniqid 13/23 字符,更短、可排序、無需加密擴展

7. 序列化:serialize() vs json_encode()

特性serialize()json_encode()
格式PHP 專有通用標準
對象支持完整(含私有屬性)僅 public 屬性
資源類型不支持不支持
性能較快較慢
可讀性差好
跨語言❌✅
<?php
$data = ['user' => ['id' => 1, 'name' => '張三'], 'tags' => ['vip', 'active']];

// PHP 內部存儲/緩存 → serialize()
$cache = serialize($data);
$restored = unserialize($cache);

// API 對接/前端傳輸/日誌 → json_encode()
$api = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

8. 字符串壓縮:gzcompress() / gzuncompress()

<?php
$longText = str_repeat('長文本內容...', 1000);
echo "原始: " . strlen($longText) . " bytes\n";

$compressed = gzcompress($longText, 6); // 壓縮級別 1-9
echo "壓縮: " . strlen($compressed) . " bytes\n"; // 通常 30%-50%

$original = gzuncompress($compressed);
// 驗證
var_dump($original === $longText); // true

// 適用場景:大文本緩存、API 響應壓縮、數據庫 Blob 存儲優化

9. 關閉回調:register_shutdown_function()

即使 exit()、致命錯誤、用戶停止瀏覽器,也會執行:

<?php
$start = microtime(true);

register_shutdown_function(function() use ($start) {
    $time = microtime(true) - $start;
    error_log("腳本執行耗時: {$time}s, 內存: " . memory_get_peak_usage());
    // 發送監控指標、釋放鎖、關閉連接池
});

// 業務邏輯
process_big_task();
exit('提前退出'); // shutdown 依然會執行
?>

注意:Shutdown 函數運行在獨立作用域,無法輸出到瀏覽器(已發送 Header),僅能寫日誌、數據庫、文件。

總結速查表

特性核心函數/語法典型應用
可變參數...$args / func_get_args()通用工具函數、日誌封裝
文件匹配glob(pattern, flags)批量處理、自動加載掃描
內存監控memory_get_usage() / _peak_usage()長運行腳本 OOM 防護
CPU 分析getrusage()性能調優、瓶頸定位
魔術常量__DIR__ / __LINE__ / __METHOD__路徑引用、調試、日誌上下文
唯一 IDuniqid(prefix, more_entropy)訂單號、Token、臨時文件名
序列化serialize / json_encode緩存存儲 / API 通信
字符串壓縮gzcompress / gzuncompress大文本存儲優化、傳輸減量
關閉回調register_shutdown_function()資源清理、執行統計、錯誤上報
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved