PHP 內建上千個函數,但高頻、高價值、易誤用的核心函數僅佔少數。本文精選 10 個開發必會函數,從參數細節、返回值特性、實戰陷阱、性能差異四個維度深度點評,附最佳實踐代碼片段。
$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) 返回字串而非輸出,便於日誌記錄
$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', '
// 讀取大文件逐行處理,記憶體佔用 = 文件大小(全載入陣列)
$lines = file('large.log', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos($line, 'ERROR') !== false) $errors++;
}
FILE_IGNORE_NEW_LINES 去換行fopen() + fgets() 流式讀取
// 僅顯示模塊信息
phpinfo(INFO_MODULES);
// 僅顯示配置
phpinfo(INFO_CONFIGURATION);
// 程序化獲取(不輸出 HTML)
ob_start(); phpinfo(INFO_GENERAL); $info = ob_get_clean();
// 讀取本地文件
$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);
// 簡單寫入
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'); // 原子操作(同文件系統)
FILE_APPEND 追加、LOCK_EX 獨佔鎖(不保證跨進程原子性)
// 兼容舊版本無 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;
}
}
$funcs = get_defined_functions();
// $funcs['internal'] = 內建函數列表
// $funcs['user'] = 用戶定義函數列表
echo "內建函數數量:" . count($funcs['internal']); // ~5000+
echo "用戶函數數量:" . count($funcs['user']);
$classes = get_declared_classes();
// PHP 5.6: ~100 內建類
// PHP 8.2: ~200+ 內建類(新增 Attribute、Enum、Fiber 等)
// 可用於自動發現插件類、檢測類衝突
echo "步驟 1\n";
exit("錯誤:配置缺失\n"); // 輸出訊息並終止,狀態碼 0
// die() 為 exit 別名
// 非零退出碼(CLI 腳本重要)
exit(1); // 僅設置狀態碼,不輸出
exit 是語言構造而非函數,不能作為回調 array_map('exit', ...)return 結束控制器;CLI 用 exit($code) 明確狀態碼| 需求 | 推薦函數 | 備選 |
|---|---|---|
| 調試輸出變量結構 | print_r($var, true) | var_dump() |
| 導出可執行 PHP 代碼 | var_export($var, true) | json_encode() |
| 讀取中小文本文件 | file() + FLAGS | file_get_contents() |
| 讀取大文件/流式處理 | fopen() + fgets() | SplFileObject |
| HTTP GET 請求 | file_get_contents() + context | cURL / Guzzle |
| 原子寫入文件 | file_put_contents() + rename | fopen + flock + fwrite |
| 檢查函數/類是否存在 | function_exists / class_exists | get_defined_functions |
掌握這 10 個核心函數的「參數細節、返回值特性、實戰陷阱、性能邊界」,足以應付 90% 的日常開發場景。記住:查手冊、看源碼、寫測試、做基準,比死記硬背參數順序更有價值。