PHP 核心知識兩千行筆記精華版
整理自實戰開發與面試高頻考點,涵蓋語法基礎、型別系統、流程控制、函數進階、物件導向、資料庫操作、錯誤異常處理、安全防護、效能優化等核心領域。適合進階開發者快速查閱與複習。
一、命名規範與語言結構
- 類別/介面:
PascalCase (如 UserService);常量:UPPER_SNAKE;變數/方法:camelCase;私有成員:_prefix;介面:I_ 前綴。
- 語言結構 (非函數,不可作為可變函數):
echo, print, isset, empty, unset, list, array, eval, exit, die。
- 預定義常量:
PHP_VERSION, PHP_OS, PHP_SAPI, PHP_EOL, DIRECTORY_SEPARATOR, PATH_SEPARATOR, PHP_INT_MAX, M_PI, M_E。
二、型別系統與轉換
| 分類 | 型別 | 檢測函數 | 強制轉換 |
| 純量 | Integer | is_int / is_integer / is_long | (int), intval() |
| Float | is_float / is_double / is_real | (float), floatval() |
| String | is_string | (string), strval() |
| Boolean | is_bool | (bool), boolval() |
| NULL | is_null | (unset) |
| Resource | is_resource | — |
| Callable | is_callable | — |
| Iterable (PHP 7.1+) | is_iterable | — |
| 複合 | Array | is_array | (array) |
| 複合 | Object | is_object | (object) |
- 浮點數不可直接比較大小,需用
abs($a-$b) < EPSILON 或 bccomp。
gettype() 取得型別;settype() 修改型別 (參考傳遞)。
var_dump() 顯示型別與值;var_export() 回傳合法 PHP 代碼字串;print_r() 易讀輸出。
三、變數進階
- 可變變數:
$$var;可變函數:$func();可變屬性/方法:$obj->$prop、$obj->$method()。
- 超全域變數:
$GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV。
$GLOBALS 為所有全域變數的關聯陣列,函數內修改 $GLOBALS['x'] 即修改全域 $x。
global $x 建立別名 (引用),不如 $GLOBALS 直觀,不建議濫用。
- 靜態變數
static $x = 1;:函數內保持狀態,僅初始化一次,生命週期贯穿腳本。
四、字串與編碼
- 單引號:不解析變數、轉義僅
\' \\,效能略高。
- 雙引號:解析變數、支援完整轉義序列 (
\n, \r, \t, \$, \"、八進制 \123、十六進制 \x41)。
- Heredoc (
<<<EOF) 等同雙引號;Nowdoc (<<<'EOF') 等同單引號。
- 多位元組字串:必須用
mbstring 擴展函數 (mb_strlen, mb_substr, mb_strpos, mb_strtolower...);內部編碼建議統一 mb_internal_encoding('UTF-8')。
iconv 轉換編碼:iconv('GBK', 'UTF-8//IGNORE', $str)。
五、陣列操作精選
| 分類 | 函數 | 說明 |
| 建立/合併 | array_merge | 合併,字串鍵後覆蓋前,數字鍵重新索引 |
| array_merge_recursive | 遞歸合併,相同鍵值變為陣列 |
| array_combine | 一陣列作鍵,一陣列作值建立新陣列 |
| array_fill / array_pad | 填充固定值 / 擴展至指定長度 |
| 搜尋/過濾 | in_array / array_search | 值存在性 / 回傳鍵名 (嚴格模式第3參數 true) |
| array_key_exists / isset($arr[$k]) | 鍵存在性 (前者包含 null 值) |
| array_filter | 回呼過濾,保留鍵不變 |
| array_map | 回呼映射值,可多陣列平行處理 |
| 堆疊/佇列 | array_push / array_pop | 陣列尾部入棧/出棧 (重新索引) |
| array_unshift / array_shift | 陣列頭部入隊/出隊 (重新索引) |
| 排序 | sort/rsort, asort/arsort, ksort/krsort, usort/uksort/uasort, natsort/natcasesort, shuffle |
| 差集/交集 | array_diff/array_diff_assoc/array_diff_key, array_intersect/array_intersect_assoc/array_intersect_key |
foreach 遍歷的是陣列 複製品,修改 $value 不影響原陣列,除非用 &$value 參考;循環體對原陣列操作 (增刪) 生效但不影響遍歷指標。
- 指標函數:
current, key, next, prev, reset, end, each;each 回傳 [1=>value, 0=>key, 'key'=>key, 'value'=>value]。
六、函數進階
- 參數:預設值 (必須在非預設參數右側)、引用傳遞 (
&$arg)、可變參數 (func_get_args())、型別宣告 (function foo(array $arr, MyClass $obj))。
- 返回:值傳遞 (預設)、引用返回 (
function &foo() 需配合 $x =& foo())、return 立即結束函數。
- 作用域:全域 vs 局部;
static 靜態局部變數;use 閉包引入外部變數 (值/引用)。
- 匿名函數/閉包:
$fn = function($x) use (&$external) { ... }; 實現 Closure 類別物件,可當回呼、陣列元素、返回值。
- 遞歸 vs 迭代:遞歸代碼簡潔但有堆疊溢位風險,深度大時改迭代。
七、物件導向 (OOP) 核心
| 特性 | 關鍵字/語法 | 重點 |
| 封裝 | public / protected / private | 屬性預設 private,提供 getter/setter |
| 繼承 | extends (單繼承) | 子類覆寫父類方法,parent::method() 調用父實作 |
| 多型 | 介面 (implements) / 抽象類 (abstract) | 介面多實現,規範契約;抽象類可含實作 |
| 靜態成員 | static | 屬於類,Class::$prop、Class::method(),$this 不可用 |
| 晚期靜態綁定 | static:: | 執行期解析,static::method() 代表調用類而非定義類 |
| 魔術方法 | __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __clone, __debugInfo |
| 單例模式 | 私有構造、靜態實例、靜態 getInstance、私有 __clone |
| 自動載入 | spl_autoload_register | PSR-4 標準,Composer 自動生成 |
| 序列化 | serialize / unserialize | 資源型別不可序列化;__sleep/__wakeup 控制過程 |
| 反射 | ReflectionClass/Method/Property | 運行時檢測結構、代理執行、註解解析 |
| Traits | trait / use | 橫向復用,解決單繼承限制,優先級: 當前類 > Trait > 父類 |
八、資料庫操作 (PDO 最佳實踐)
$dsn = 'mysql:host=127.0.0.1;dbname=test;charset=utf8mb4';
$pdo = new PDO($dsn, '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 ...');
$pdo->exec('UPDATE ...');
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
九、錯誤與異常處理
- 錯誤等級:
E_ERROR, E_WARNING, E_NOTICE, E_DEPRECATED, E_STRICT 等;error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT)。
- 生產環境:
display_errors=Off, log_errors=On, error_log=/var/log/php/error.log。
- 自定義錯誤處理器:
set_error_handler(function($level, $msg, $file, $line) { ... })。
- 異常:
try { } catch (SpecificException $e) { } catch (Exception $e) { } finally { };自定義異常繼承 Exception;set_exception_handler 捕獲未處理異常。
Throwable (PHP 7+) 為 Error 與 Exception 共同介面,可 catch (Throwable $e) 捕獲所有。
十、安全防護清單
- SQL 注入:全域使用 PDO 預處理,嚴禁拼接 SQL。
- XSS:輸出到 HTML 用
htmlspecialchars($str, ENT_QUOTES, 'UTF-8');輸出到 JS 用 json_encode;引入 HTMLPurifier 過濾富文本。
- CSRF:表單隱藏
_token,驗證 $_SESSION['_token'] === $_POST['_token'];同站 Cookie SameSite=Strict/Lax。
- 檔案上傳:驗證 MIME (
finfo_file)、副檔名、大小;儲存路徑非 Web 可訪問;重命名亂數檔名;Nginx 禁用上傳目錄 PHP 執行。
- 密碼儲存:
password_hash($pwd, PASSWORD_BCRYPT)、password_verify($pwd, $hash);禁止 MD5/SHA1。
- Session 安全:
session.use_strict_mode=1, session.cookie_httponly=1, session.cookie_secure=1 (HTTPS), session.cookie_samesite=Lax;定期 session_regenerate_id(true)。
- 命令注入:避免
exec, shell_exec, system, passthru;若必須用,參數經 escapeshellarg、escapeshellcmd。
十一、效能優化關鍵點
- 啟用 OPcache (PHP 內建):
opcache.enable=1, opcache.memory_consumption=256, opcache.max_accelerated_files=20000, opcache.validate_timestamps=0 (生產)。
- 使用 Composer Classmap/PSR-4 自動載入,避免大量
require_once。
- 資料庫:索引優化、避免
SELECT *、分頁用 WHERE id > last_id LIMIT n 而非 OFFSET、讀寫分離、Redis 快取熱點資料。
- HTTP:Nginx
gzip、expires 快取靜態資源、CDN、Keep-Alive、HTTP/2。
- Profiling:
xhprof、Blackfire、Tideways 定位熱點函數。
十二、常用超全域變數 $_SERVER 速查
| 鍵名 | 含義 | 範例 |
| REQUEST_METHOD | 請求方法 | GET, POST |
| REQUEST_URI | 完整請求 URI | /api/user?id=1 |
| QUERY_STRING | 查詢字串 | id=1&name=test |
| HTTP_HOST | Host 標頭 | example.com |
| HTTP_USER_AGENT | 客戶端 UA | Mozilla/5.0... |
| HTTP_REFERER | 來源頁面 | https://google.com/ |
| REMOTE_ADDR | 客戶端 IP | 192.168.1.1 |
| SERVER_ADDR | 伺服器 IP | 10.0.0.5 |
| SCRIPT_FILENAME | 當前腳本絕對路徑 | /var/www/html/index.php |
| DOCUMENT_ROOT | 網站根目錄 | /var/www/html |
| PHP_SELF | 當前腳本相對路徑 | /index.php |
| REQUEST_TIME | 請求開始時間戳 | 1700000000 |
十三、日期時間處理
time() 秒級時間戳;microtime(true) 微秒級浮點數。
date('Y-m-d H:i:s') 格式化;DateTime 物件導向介面 (支援時區、大於 2038 年)。
strtotime('+1 day') 相對時間解析;DateTime::createFromFormat 解析指定格式。
- 時區:
date_default_timezone_set('Asia/Taipei') 或 php.ini: date.timezone。
十四、Composer 與現代開發流
composer require vendor/package 安裝套件;composer dump-autoload -o 生成優化自動載入。
composer.json 定義依賴、腳本、自動載入規則 (PSR-4)。
- 常用套件:
monolog/monolog (日誌)、vlucas/phpdotenv (環境變數)、firebase/php-jwt (JWT)、ramsey/uuid (UUID)、phpoffice/phpspreadsheet (Excel)。
十五、命令列 (CLI) 模式
php -r 'echo "Hello";' # 單行代碼
php -l file.php # 語法檢查
php -i # phpinfo
php -m # 已載入模組
php script.php arg1 arg2 # 執行腳本,$argv[0]=腳本名,$argv[1]=arg1,$argc=參數數
# 只在 CLI 模式可用:STDIN, STDOUT, STDERR 常數資源
筆記持續更新中,歡迎星標收藏。配套 MySQL 筆記:一千行 MySQL 學習筆記