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

PHP 核心函數精選點評:print_r、var_export、file、file_get_contents 等 10 大必會函數實戰指南

     編輯:PHP 綜合知識

PHP 內建上千個函數,但高頻、高價值、易誤用的核心函數僅佔少數。本文精選 10 個開發必會函數,從參數細節、返回值特性、實戰陷阱、性能差異四個維度深度點評,附最佳實踐代碼片段。

1. print_r() — 調試輸出首選


$arr = ['a' => 'apple', 'b' => ['x', 'y', 'z']];
print_r($arr);
/* 輸出:
Array
(
    [a] => apple
    [b] => Array
        (
            [0] => x
            [1] => y
            [2] => z
        )
)
*/
  • 優勢:結構清晰、支援遞歸、無需擴展
  • 陷阱:直接輸出到瀏覽器需配合 <pre> 或 CLI 環境;對象屬性需實現 __debugInfo()
  • 進階:print_r($var, true) 返回字串而非輸出,便於日誌記錄

2. var_export() — 可執行的 PHP 代碼表示


$arr = [1, 2, ['a', 'b', 'c']];
$code = var_export($arr, true); // 返回字串
// $code = "array (\n  0 => 1,\n  1 => 2,\n  2 => \n  array (\n    0 => 'a',\n    1 => 'b',\n    2 => 'c',\n  ),\n)"
file_put_contents('cache.php', '
  • 核心價值:輸出合法 PHP 代碼,實現「代碼即數據」,適用於配置緩存、靜態數據導出
  • 注意:資源類型、閉包無法導出;循環引用會報錯

3. file() — 文件讀入陣列,逐行處理利器


// 讀取大文件逐行處理,記憶體佔用 = 文件大小(全載入陣列)
$lines = file('large.log', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
    if (strpos($line, 'ERROR') !== false) $errors++;
}
  • 適用:中小文件(< 100MB)、需隨機訪問行、配合 FILE_IGNORE_NEW_LINES 去換行
  • 避坑:大文件會耗盡記憶體,改用 fopen() + fgets() 流式讀取

4. phpinfo() — 環境診斷瑞士軍刀


// 僅顯示模塊信息
phpinfo(INFO_MODULES);
// 僅顯示配置
phpinfo(INFO_CONFIGURATION);
// 程序化獲取(不輸出 HTML)
ob_start(); phpinfo(INFO_GENERAL); $info = ob_get_clean();
  • 生產環境必須禁用或限制訪問:洩露路徑、版本、模塊等敏感信息

5. file_get_contents() — 讀取文件/HTTP 內容到字串


// 讀取本地文件
$content = file_get_contents('config.json');

// 發起 HTTP GET 請求(需 allow_url_fopen=On)
$json = file_get_contents('https://api.example.com/data.json', false, stream_context_create([
    'http' => ['timeout' => 5, 'header' => 'User-Agent: MyApp/1.0']
]));
$data = json_decode($json, true);
  • 優勢:簡潔、內部支援 mmap 零拷貝、可配合 stream context 實現 HTTP 請求
  • 大文件:依然全量載入記憶體,超大文件用流式讀取

6. file_put_contents() — 原子寫入文件


// 簡單寫入
file_put_contents('cache.json', json_encode($data));

// 原子寫入(防止讀取到半寫文件):寫臨時文件 → rename
$tmp = 'cache.json.tmp.' . uniqid();
file_put_contents($tmp, json_encode($data));
rename($tmp, 'cache.json'); // 原子操作(同文件系統)
  • FLAGS:FILE_APPEND 追加、LOCK_EX 獨佔鎖(不保證跨進程原子性)
  • 二進制安全:可直接寫入圖片、PDF 等二進制數據

7. function_exists() — 動態函數存在性檢查


// 兼容舊版本無 file_put_contents
if (!function_exists('file_put_contents')) {
    function file_put_contents($filename, $data, $flags = 0) {
        $fp = fopen($filename, ($flags & FILE_APPEND) ? 'ab' : 'wb');
        if ($flags & LOCK_EX) flock($fp, LOCK_EX);
        fwrite($fp, $data);
        fclose($fp);
    }
}

// 條件定義函數(如 polyfill)
if (!function_exists('str_contains')) {
    function str_contains(string $haystack, string $needle): bool {
        return strpos($haystack, $needle) !== false;
    }
}

8. get_defined_functions() — 獲取所有已定義函數


$funcs = get_defined_functions();
// $funcs['internal'] = 內建函數列表
// $funcs['user'] = 用戶定義函數列表
echo "內建函數數量:" . count($funcs['internal']); // ~5000+
echo "用戶函數數量:" . count($funcs['user']);
  • 用途:調試命名衝突、動態生成 API 文檔、檢測擴展是否載入

9. get_declared_classes() — 獲取所有已定義類


$classes = get_declared_classes();
// PHP 5.6: ~100 內建類
// PHP 8.2: ~200+ 內建類(新增 Attribute、Enum、Fiber 等)
// 可用於自動發現插件類、檢測類衝突

10. exit / die — 腳本終止


echo "步驟 1\n";
exit("錯誤:配置缺失\n"); // 輸出訊息並終止,狀態碼 0
// die() 為 exit 別名

// 非零退出碼(CLI 腳本重要)
exit(1); // 僅設置狀態碼,不輸出
  • 注意:exit 是語言構造而非函數,不能作為回調 array_map('exit', ...)
  • 最佳實踐:Web 環境用 return 結束控制器;CLI 用 exit($code) 明確狀態碼

函數選型決策表

需求推薦函數備選
調試輸出變量結構print_r($var, true)var_dump()
導出可執行 PHP 代碼var_export($var, true)json_encode()
讀取中小文本文件file() + FLAGSfile_get_contents()
讀取大文件/流式處理fopen() + fgets()SplFileObject
HTTP GET 請求file_get_contents() + contextcURL / Guzzle
原子寫入文件file_put_contents() + renamefopen + flock + fwrite
檢查函數/類是否存在function_exists / class_existsget_defined_functions

結語

掌握這 10 個核心函數的「參數細節、返回值特性、實戰陷阱、性能邊界」,足以應付 90% 的日常開發場景。記住:查手冊、看源碼、寫測試、做基準,比死記硬背參數順序更有價值。

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