PHP 內建上千個函數,掌握高頻核心函數是提升開發效率的關鍵。本文將最常用的函數按功能分類整理,提供語法、參數說明、實戰示例,適合作為開發時的桌面速查手冊。
一、MySQL 數據庫操作(mysqli/PDO 推薦,mysql_* 已棄用)
注意:mysql_* 系列函數自 PHP 5.5 棄用,PHP 7.0 移除。現代項目請使用 mysqli 或 PDO。本節僅作歷史代碼維護參考。
| 函數 | 用途 | 現代替代方案 |
| mysql_connect() | 建立連接 | new mysqli() / new PDO() |
| mysql_select_db() | 選擇數據庫 | mysqli_select_db() / PDO::exec() |
| mysql_query() | 執行 SQL | mysqli_query() / PDO::query() |
| mysql_fetch_array() | 獲取結果行(數組) | mysqli_fetch_array() / PDOStatement::fetch() |
| mysql_fetch_assoc() | 獲取關聯數組 | mysqli_fetch_assoc() / PDO::FETCH_ASSOC |
| mysql_fetch_object() | 獲取對象 | mysqli_fetch_object() / PDO::FETCH_OBJ |
| mysql_num_rows() | 結果行數 | mysqli_num_rows() / rowCount() |
| mysql_insert_id() | 最後自增 ID | mysqli_insert_id() / PDO::lastInsertId() |
| mysql_data_seek() | 移動結果指針 | mysqli_data_seek() |
| mysql_close() | 關閉連接 | mysqli_close() / PDO = null |
現代 PDO 範例
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
// 預處理語句(防注入)
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status = ?');
$stmt->execute([$email, 1]);
$user = $stmt->fetch();
// 事務
$pdo->beginTransaction();
try {
$pdo->exec("INSERT INTO logs (msg) VALUES ('start')");
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
?>
二、文件系統操作
| 函數 | 用途 | 示例 |
| fopen() | 打開文件/URL | $fp = fopen('data.txt', 'r'); $fp = fopen('https://api.example.com', 'r'); |
| fclose() | 關閉文件指針 | fclose($fp); |
| fread() | 讀取指定長度 | $content = fread($fp, filesize('data.txt')); |
| fgets() | 按行讀取 | while ($line = fgets($fp)) { ... } |
| fwrite() / fputs() | 寫入數據 | fwrite($fp, "Hello\n"); |
| file_get_contents() | 一次性讀取整文件 | $content = file_get_contents('data.txt'); |
| file_put_contents() | 一次性寫入文件 | file_put_contents('log.txt', "msg\n", FILE_APPEND); |
| file() | 讀取為數組(按行) | $lines = file('data.txt', FILE_IGNORE_NEW_LINES); |
| file_exists() | 檢查文件存在 | if (file_exists('config.php')) ... |
| is_file() / is_dir() | 判斷文件/目錄 | is_dir('uploads') && mkdir('uploads', 0755, true); |
| filesize() | 獲取文件大小 | $size = filesize('large.zip'); |
| unlink() | 刪除文件 | unlink('temp.tmp'); |
| mkdir() | 創建目錄(遞歸) | mkdir('a/b/c', 0755, true); |
| rmdir() | 刪除空目錄 | rmdir('empty_dir'); |
| copy() | 複製文件 | copy('src.jpg', 'dst.jpg'); |
| rename() | 移動/重命名 | rename('old.txt', 'new.txt'); |
| pathinfo() | 解析路徑信息 | pathinfo('/a/b/file.txt') → ['dirname','basename','extension','filename'] |
| realpath() | 獲取絕對路徑 | realpath('./config.php'); |
| glob() | 模式匹配文件 | foreach (glob('*.php') as $f) ... |
| scandir() | 掃描目錄 | $files = scandir('.'); |
| stat() / fstat() | 文件狀態信息 | $info = stat('file.txt'); // size, mtime, mode... |
| filemtime() | 修改時間 | filemtime('cache.dat') |
| touch() | 創建/更新時間戳 | touch('flag.lock'); |
實用片段:安全讀寫大文件
<?php
// 大文件逐行處理(內存友好)
$fp = fopen('huge.log', 'r');
while (($line = fgets($fp)) !== false) {
if (strpos($line, 'ERROR') !== false) {
processErrorLine($line);
}
}
fclose($fp);
// 原子寫入(防止部分寫入被讀取)
$tmp = 'config.php.tmp.' . uniqid();
file_put_contents($tmp, $newContent);
rename($tmp, 'config.php'); // 原子操作
?>
三、日期時間處理
核心函數
| 函數 | 用途 | 示例 |
| time() | 當前 Unix 時間戳 | 1705300800 |
| date() | 格式化本地時間 | date('Y-m-d H:i:s') |
| gmdate() | 格式化 GMT 時間 | gmdate('Y-m-d H:i:s') |
| mktime() | 構建時間戳 | mktime(0,0,0,12,25,2024) |
| strtotime() | 解析英文時間描述 | strtotime('+1 week'), strtotime('last Monday') |
| getdate() | 獲取日期組件數組 | ['year'=>2024, 'mon'=>1, 'mday'=>15, ...] |
| checkdate() | 驗證日期合法性 | checkdate(2, 29, 2024) // true |
| DateTime 類 | 面向對象操作(推薦) | new DateTime('now', new DateTimeZone('Asia/Shanghai')) |
date() 格式字符完整表
| 字符 | 說明 | 示例 |
| Y | 4位年份 | 2024 |
| y | 2位年份 | 24 |
| m | 月份(01-12) | 01 |
| n | 月份(1-12) | 1 |
| F | 月份全稱 | January |
| M | 月份縮寫 | Jan |
| d | 日期(01-31) | 15 |
| j | 日期(1-31) | 15 |
| l | 星期全稱 | Monday |
| D | 星期縮寫 | Mon |
| w | 星期(0-6, 0=周日) | 1 |
| H | 24小時(00-23) | 14 |
| G | 24小時(0-23) | 14 |
| h | 12小時(01-12) | 02 |
| g | 12小時(1-12) | 2 |
| i | 分鐘(00-59) | 30 |
| s | 秒(00-59) | 45 |
| a | am/pm | pm |
| A | AM/PM | PM |
| U | Unix 時間戳 | 1705300800 |
| c | ISO 8601 | 2024-01-15T14:30:45+08:00 |
| r | RFC 2822 | Mon, 15 Jan 2024 14:30:45 +0800 |
DateTime 現代用法(強烈推薦)
<?php
$dt = new DateTime('now', new DateTimeZone('Asia/Shanghai'));
echo $dt->format('Y-m-d H:i:s'); // 2024-01-15 14:30:45
// 運算
$dt->modify('+1 month');
$dt->add(new DateInterval('P7D')); // 加 7 天
$dt->sub(new DateInterval('P1Y')); // 減 1 年
// 差值
$diff = $dt1->diff($dt2);
echo $diff->days; // 總天數
echo $diff->format('%y年%m月%d天 %h小時%i分');
// 時區轉換
$dt->setTimezone(new DateTimeZone('UTC'));
echo $dt->format('c');
// 解析
$dt = DateTime::createFromFormat('Y/m/d H:i', '2024/01/15 14:30');
?>
四、字符串處理
| 函數 | 用途 | 示例 |
| strlen() | 字節長度 | strlen('中文') // 6 (UTF-8) |
| mb_strlen() | 字符長度 | mb_strlen('中文', 'UTF-8') // 2 |
| substr() | 截取子串(字節) | substr('abcdef', 1, 3) // 'bcd' |
| mb_substr() | 截取子串(字符) | mb_substr('中文測試', 1, 2, 'UTF-8') // '文測' |
| strpos() / mb_strpos() | 查找位置 | strpos('hello world', 'world') // 6 |
| str_replace() | 替換(區分大小寫) | str_replace('a', 'b', 'abc') // 'bbc' |
| str_ireplace() | 替換(不區分大小寫) | str_ireplace('A', 'b', 'Abc') // 'bbc' |
| preg_replace() | 正則替換 | preg_replace('/\d+/', '*', 'a1b2') // 'a*b*' |
| explode() | 分割為數組 | explode(',', 'a,b,c') // ['a','b','c'] |
| implode() / join() | 數組連接為字符串 | implode('-', ['a','b','c']) // 'a-b-c' |
| trim() / ltrim() / rtrim() | 去除空白字符 | trim(" hi ") // 'hi' |
| htmlspecialchars() | HTML 轉義(防 XSS) | htmlspecialchars('<script>', ENT_QUOTES, 'UTF-8') |
| htmlentities() | 所有字符實體化 | htmlentities('中文', ENT_QUOTES, 'UTF-8') |
| nl2br() | 換行轉 <br> | nl2br("line1\nline2") |
| strip_tags() | 去除 HTML 標籤 | strip_tags('<b>bold</b>') // 'bold' |
| md5() / sha1() / hash() | 哈希 | hash('sha256', 'data') |
| password_hash() / verify() | 密碼哈希(推薦) | password_hash('pwd', PASSWORD_DEFAULT) |
| strtolower() / strtoupper() | 大小寫轉換 | mb_strtolower('ABC', 'UTF-8') |
| ucfirst() / ucwords() | 首字母/單詞首字母大寫 | ucwords('hello world') // 'Hello World' |
| sprintf() / vsprintf() | 格式化字符串 | sprintf('%04d-%02d-%02d', 2024, 1, 15) |
| parse_str() | 解析查詢字符串 | parse_str('a=1&b=2', $arr) |
| http_build_query() | 構建查詢字符串 | http_build_query(['a'=>1, 'b'=>2]) |
五、數學運算
| 函數 | 用途 | 示例 |
| abs() | 絕對值 | abs(-3.14) // 3.14 |
| ceil() | 向上取整 | ceil(4.1) // 5 |
| floor() | 向下取整 | floor(4.9) // 4 |
| round() | 四捨五入 | round(3.14159, 2) // 3.14 |
| rand() / mt_rand() | 隨機整數 | mt_rand(1, 100) |
| random_int() | 加密安全隨機整數 | random_int(1, 100) |
| min() / max() | 最小/最大值 | max([3, 7, 2]) // 7 |
| pow() / ** | 冪運算 | 2 ** 10 // 1024 |
| sqrt() | 平方根 | sqrt(16) // 4 |
| sin() / cos() / tan() | 三角函數(弧度) | sin(M_PI_2) // 1 |
| deg2rad() / rad2deg() | 角度弧度轉換 | deg2rad(180) // M_PI |
| pi() / M_PI | 圓周率常量 | M_PI // 3.1415926535898 |
| is_nan() / is_infinite() | 判斷非數字/無窮大 | is_nan(acos(2)) // true |
| number_format() | 格式化數字 | number_format(1234.56, 2, '.', ',') // '1,234.56' |
| bcadd() / bccomp() / ... | 高精度計算(BCMath) | bcadd('0.1', '0.2', 10) // '0.3' |
六、Session 會話管理
| 函數 | 用途 | 示例 |
| session_start() | 啟動/恢復會話 | session_start(); // 必須在輸出前調用 |
| $_SESSION | 會話數據超全局變量 | $_SESSION['user_id'] = 123; |
| session_destroy() | 銷毀會話 | session_destroy(); |
| session_unset() | 釋放所有會話變量 | session_unset(); |
| session_regenerate_id() | 重新生成 Session ID | session_regenerate_id(true); // 防固定攻擊 |
| session_set_cookie_params() | 設置 Cookie 參數 | session_set_cookie_params(3600, '/', '.example.com', true, true); |
| session_name() | 獲取/設置會話名稱 | session_name('MYAPP'); |
| session_id() | 獲取/設置 Session ID | session_id('custom_id'); |
| session_status() | 獲取會話狀態 | session_status() === PHP_SESSION_ACTIVE |
最佳實踐
<?php
// 安全配置(放在 session_start() 之前)
ini_set('session.cookie_httponly', 1); // 禁止 JS 訪問
ini_set('session.cookie_secure', 1); // 僅 HTTPS 傳輸
ini_set('session.use_strict_mode', 1); // 嚴格模式
ini_set('session.use_only_cookies', 1); // 僅 Cookie 傳遞 ID
ini_set('session.cookie_samesite', 'Lax'); // CSRF 防護
session_start();
// 登入時重新生成 ID
if ($loginSuccess) {
session_regenerate_id(true);
$_SESSION['user'] = $userData;
}
// 權限檢查
function requireLogin() {
if (empty($_SESSION['user'])) {
header('Location: /login.php');
exit;
}
}
?>
七、數組操作
| 函數 | 用途 | 示例 |
| count() | 元素個數 | count($arr) |
| array_key_exists() / isset() | 檢查鍵存在 | isset($arr['key']) |
| in_array() | 檢查值存在 | in_array('value', $arr, true) // 嚴格模式 |
| array_push() / [] | 壓入元素 | $arr[] = 'new'; |
| array_pop() | 彈出最後元素 | $last = array_pop($arr); |
| array_shift() / array_unshift() | 隊首操作 | array_unshift($arr, 'first'); |
| array_merge() | 合併數組 | array_merge($a, $b) |
| array_combine() | 鍵值組合 | array_combine($keys, $values) |
| array_keys() / array_values() | 提取鍵/值 | array_keys($assocArr) |
| array_flip() | 交換鍵值 | array_flip(['a'=>1, 'b'=>2]) // [1=>'a', 2=>'b'] |
| array_reverse() | 反轉數組 | array_reverse([1,2,3]) // [3,2,1] |
| array_slice() | 切片 | array_slice($arr, 1, 3) |
| array_splice() | 剪切/替換 | array_splice($arr, 1, 2, ['x','y']) |
| array_map() | 映射轉換 | array_map('trim', $arr) |
| array_filter() | 過濾 | array_filter($arr, fn($v) => $v > 10) |
| array_reduce() | 歸約 | array_reduce($arr, fn($c,$v)=>$c+$v, 0) |
| array_walk() | 遍歷修改 | array_walk($arr, fn(&$v) => $v *= 2) |
| array_column() | 提取列 | array_column($users, 'name') |
| array_unique() | 去重 | array_unique([1,2,2,3]) // [1,2,3] |
| sort() / rsort() | 索引數組排序 | sort($arr); rsort($arr); |
| asort() / arsort() | 關聯數組按值排序 | asort($arr); // 保持鍵值關係 |
| ksort() / krsort() | 關聯數組按鍵排序 | ksort($arr); |
| usort() / uasort() / uksort() | 自定義比較排序 | usort($arr, fn($a,$b) => $a <=> $b); |
| shuffle() | 隨機打亂 | shuffle($arr); |
| range() | 生成範圍數組 | range(1, 10) // [1..10] |
| list() / [] 解構 | 解包賦值 | [$a, $b, $c] = [1,2,3]; |
| json_encode() / json_decode() | JSON 轉換 | json_encode($arr, JSON_UNESCAPED_UNICODE) |
速查建議
- 收藏本文:作為日常開發快速查閱
- 優先現代 API:PDO、DateTime、password_hash、random_int、mb_* 系列
- 查閱官方文檔:php.net 獲取最新參數、返回值、版本要求
- 善用 IDE 提示:PHPStorm/VS Code + PHP Intelephense 可大幅減少查閱
- 建立團隊片段庫:將常用模式封裝為代碼片段
熟練掌握這些核心函數,能讓您的 PHP 代碼更簡潔、更健壯、更具可維護性。