PHP 速查 — 簡明參考
PHP 8.3 語法、類型、數組與最常用標準庫速查手冊,覆蓋約 80% 日常場景。
PHP PHP 8.3 (LTS 風格)
Zend Engine (PHP 運行時) · 命令式 · OO · 函數式 · 動態(帶可選靜態類型)
學習路徑
先會用 php hello.php 與 php -S 內置服務器跑起來 → 掌握變量、類型與流程控制 → 深入函數、閉包與數組 → 理解引用語義與對象句柄 → 用類、接口與異常組織代碼 → 再按需學文件 I/O、cURL、時間與正則 → 用 Fiber/pcntl 處理併發。FAQ 節適合回頭避坑。
1.Hello World 與運行環境
運行 PHP 程序、內置 Web 服務器、命令行參數與退出碼。
最小程序
PHP 文件以 <?php 開始,CLI 用 php 文件名運行。echo 輸出字符串。
CLI 運行
php 命令直接運行腳本。php -l 檢查語法,php -r 直接執行代碼。
內置 Web 服務器
php -S 啓動內置服務器,把目錄當文檔根,適合本地開發調試。
文件結構
<?php 與 ?> 標記切分 PHP 與 HTML。純 PHP 文件推薦省略結束標籤。
命令行參數
$argv 是參數數組,$argc 是參數個數,argv[0] 是腳本名。
退出碼
exit() 或 die() 結束腳本並返回狀態碼,0 成功,非 0 出錯。
文件引入
require 引入必須存在的文件,include 失敗僅警告,_once 防止重複引入。
環境檢查
php -i 打印配置,php -m 列出擴展,phpinfo() 輸出完整信息。
2.變量與常量
變量聲明、常量、類型聲明、嚴格模式與作用域。
變量聲明
變量以 $ 開頭,無需聲明類型,首次賦值即創建,名字大小寫敏感。
值複製賦值
普通賦值按值複製,標量獨立。數組也是複製,但底層寫時複製優化。
常量
const 定義命名空間常量,define() 定義全局常量,定義後不可修改。
魔術常量
__DIR__、__FILE__、__LINE__ 等編譯期常量在對應位置求值,常用於日誌。
作用域與 static
函數內變量默認局部,global 引入全局變量,static 保留多次調用間的值。
參數與返回類型
參數與返回值可聲明類型,弱模式下自動轉換,配合 strict_types 變嚴格。
嚴格模式
declare(strict_types=1) 嚴格校驗類型,不匹配直接拋 TypeError。
命名約定
類與命名空間大駝峯,函數與變量小駝峯,常量全大寫,遵循 PSR-12。
3.數據類型
標量、數組、null、枚舉與類型系統,理解弱轉換與類型檢查。
標量類型
int、float、string、bool 四種標量。字符串是字節序列,中文按多字節處理。
數組
PHP 數組是有序映射,整數與字符串鍵,同時充當列表與字典。
null 與空值
null 表示沒有值。未賦值變量、顯式 null、函數返回 null 都是 null。
callable 與 iterable
callable 表示可調用,iterable 表示可遍歷的數組或 Traversable 對象。
mixed 與 void
mixed 表示任意類型,void 無返回值,never 表示永不返回。
枚舉 enum
enum(8.1+)定義一組具名常量,純枚舉或帶值枚舉,可加方法。
聯合與交集類型
int|float 表示兩者之一,交集類型要求同時滿足多個接口約束。
弱類型轉換
弱模式下運算時自動轉換類型,字符串數字比較規則特殊,見 FAQ。
類型檢查函數
is_int、is_string 等 is_* 系列判斷類型,返回布爾值。
4.引用與內存語義
PHP 沒有裸指針:變量引用、寫時複製、對象句柄與 null 處理。
引用是什麼
PHP 引用是變量的別名,兩個名字指向同一內容,一改俱改。
寫時複製
數組與對象賦值先共享數據,真正寫入時才複製,節省內存。
引用賦值
unset 只解除當前名字的引用,不影響其它別名指向的內容。
引用參數
參數前加 & 按引用傳遞,函數內修改會反映到調用方變量。
對象句柄
對象變量存的是句柄,賦值、傳參都指向同一實例,要副本用 clone。
null 處理
isset 判斷存在且非 null,is_null 判斷是否為 null,empty 判斷是否為空。
空合併 ??
?? 左側不存在或為 null 時返回右側,可鏈式,可配合 throw。
可變變量
$$var 用變量值作另一個變量的名字,可讀性差,建議用數組。
unset 與內存
unset 釋放名字並遞減引用計數,歸零後內存可回收,循環引用由 GC 處理。
5.流程控制
條件、循環、switch、match 與 break/continue。
if / else
if 判斷條件執行分支,elseif 依次嘗試,else 兜底。
三元運算符
條件 ? 真值 : 假值 是表達式可賦值,嵌套會損害可讀性。
switch 語句
switch 默認寬鬆比較,匹配後需 break 否則穿透,default 兜底。
match 表達式
match(8.0+)嚴格比較有返回值,分支自動返回,無需 break。
for 循環
for(初始化; 條件; 步進) 經典計數循環,步進可自由控制。
foreach 遍歷
foreach 遍歷數組與對象,可同時取鍵值,引用修改需注意殘留。
while 與 do-while
while 先判斷後執行可能零次,do-while 至少執行一次。
break 與 continue
break 跳出循環或 switch,continue 跳到下一次迭代,可帶數字跳出多層。
6.函數與閉包
函數定義、默認參數、可變參數、命名參數、閉包與生成器。
函數定義
function 定義函數,參數帶類型,return 返回。函數名大小寫不敏感。
默認參數
參數可給默認值,調用時可省略。默認值須是常量表達式。
可變參數
...$args 收集所有剩餘參數為數組,放在參數列表最後。
命名參數
調用時用 參數名: 值 傳參(8.0+),可跳過可選參數,順序不限。
返回類型
返回類型聲明在冒號後,支持 void、?T、聯合與數組。
閉包
匿名函數用 function() 定義,use 捕獲外部變量,可賦給變量或作回調。
箭頭函數
fn() => 表達式 自動按值捕獲外層變量,單表達式簡潔,常用於回調。
可調用對象
8.1+ 用 strlen(...) 創建 first-class callable,把函數變成一等值。
生成器
yield 逐項產出值的函數叫生成器,惰性求值,處理大數據省內存。
7.字符串
字符串字面量、插值、拼接、多字節處理與常用函數。
字符串字面量
單引號按原樣輸出,雙引號解析轉義與變量。常用兩種風格。
變量插值
雙引號內 $var 直接插值,複雜表達式用花括號 {$arr['k']}。
字符串拼接
. 拼接兩個字符串,.= 追加。多次拼接用 implode 或 sprintf 更清晰。
多字節函數
處理中文用 mb_ 前綴函數按字符計數,strlen 按字節計數。
格式化 sprintf
sprintf/printf 用 %s、%d 佔位符格式化,比拼接更易讀。
查找與替換
strpos 找位置,str_contains 判斷包含,str_replace 批量替換。
拆分與合併
explode 按分隔符拆成數組,implode 把數組拼回字符串。
大小寫與去空白
strtolower/strtoupper 轉大小寫,trim 去首尾空白,ltrim/rtrim 只去一邊。
8.數組與集合
數組創建、增刪改查、遍歷、排序與 Spl 數據結構。
創建數組
[] 或 array() 創建數組。數組字面量自動分配遞增整數鍵。
訪問與修改
下標訪問元素,[] 追加,unset 刪除。鍵不存在時讀取會警告。
增刪與計數
array_push/array_pop 操作棧尾,array_shift/unshift 操作隊頭,count 計數。
遍歷數組
foreach 遍歷值或鍵值對,列表解構遍歷二維數組。
映射與過濾
array_map 逐元素轉換,array_filter 按回調過濾,array_reduce 歸約。
排序
sort 排序值、ksort 按鍵、asort 按值且保留鍵關聯,usort 自定義比較。
合併與切片
array_merge 合併數組,array_slice 取子數組,array_combine 拼鍵值。
解構賦值
列表 [] 或鍵值 [] 解構把數組元素賦給多個變量,foreach 中也可用。
Spl 數據結構
SplStack、SplQueue、SplFixedArray 提供固定功能的數據結構。
9.內存與性能
引用計數、循環引用 GC、WeakReference 與內存測量。
引用計數
zval 記錄引用數,歸零時立即回收。賦值、傳參都會增加計數。
循環引用 GC
對象互相引用時引用計數永不歸零,由循環垃圾收集器定期清理。
WeakReference 弱引用
WeakReference(8.0+)持有對象但不阻止回收,適合緩存等場景。
內存測量
memory_get_usage 查看當前佔用,memory_get_peak_usage 看峯值。
及時釋放
大變量用完後 unset 讓引用計數歸零,降低峯值,批量處理更穩。
OPcache 緩存
OPcache 緩存編譯後的字節碼,避免每次請求重複編譯,生產必開。
大數據處理
超大數組內存吃緊,用生成器、流式讀取與 SplFixedArray 控制佔用。
性能要點
避免字符串拼接循環、預分配、複用連接與減少冗餘查詢。
10.面向對象
類、構造、可見性、繼承、接口、trait 與只讀屬性。
類定義
class 定義類,屬性帶類型,方法在類內聲明。new 創建實例。
構造與屬性提升
__construct 構造方法初始化對象。8.0+ 構造參數直接提升為屬性。
可見性
public 公開、protected 子類可見、private 僅本類,默認 public。
繼承
extends 繼承父類,重寫方法,parent:: 調用父類方法。
接口
interface 定義方法簽名,implements 實現。類可實現多個接口。
抽象類
abstract class 不能被實例化,抽象方法由子類實現。
trait 複用
trait 橫向複用方法到多個類,use 引入,可組合多個 trait。
靜態成員
static 屬性與方法屬於類而非實例,self:: 或類名:: 訪問。
只讀屬性
readonly 屬性(8.1+)只能在聲明與構造中賦值一次,之後只讀。
11.錯誤處理
異常層級、try/catch/finally、自定義異常與錯誤處理。
try / catch
try 塊拋出的異常由 catch 捕獲,捕獲後程序繼續運行。
Throwable 層級
Throwable 是基類,Error 表示引擎錯誤,Exception 表示程序異常。
自定義異常
繼承 Exception 或 RuntimeException 定義業務異常,攜帶額外字段。
多重捕獲
catch 多個異常類型用 | 分隔,按順序匹配,子類先於父類。
finally
finally 無論是否拋異常都會執行,用於清理資源、關閉連接。
全局異常處理器
set_exception_handler 兜底處理未捕獲異常,統一日誌與響應。
Error 與 Exception
引擎錯誤是 Error(類型/參數),業務異常是 Exception,分開捕獲。
異常鏈
catch 中拋出新異常時把原異常作為第三個參數,getPrevious 追溯。
12.文件 I/O
讀取寫入文件、JSON、CSV 與標準流。
讀取文件
file_get_contents 讀整個文件為字符串,小文件首選,失敗返回 false。
寫入文件
file_put_contents 寫字符串,追加用 FILE_APPEND,返回寫入字節數。
逐行讀取
fopen + fgets 逐行讀取,內存恆定,適合大文件。
打開模式
fopen 的 r/w/a 模式控制讀寫行為,w 會清空原內容。
JSON 編解碼
json_encode 轉 JSON,json_decode 解析。第二參數 true 得數組。
CSV 讀寫
fgetcsv 解析一行 CSV,fputcsv 寫一行,自動處理引號與轉義。
目錄與 glob
glob 按模式匹配文件,scandir 列目錄,mkdir 建目錄。
標準流
STDIN、STDOUT、STDERR 常亮對應標準輸入輸出,CLI 常用。
13.常見坑
日常開發最容易踩的坑與正確寫法。
== 與 ===
== 寬鬆比較會轉換類型,=== 嚴格比較類型與值。判斷儘量用 ===。
foreach 引用陷阱
foreach 用 & 修改元素後,最後一個元素仍指向原數組,複用 $item 會污染。
isset 與鍵存在
isset 認為值為 null 的鍵不存在,判斷鍵是否真實存在用 array_key_exists。
弱類型比較坑
弱比較下字符串與數字比較規則特殊,'0' 與 false 相等,需顯式轉換。
未定義鍵警告
訪問不存在的數組鍵觸發警告(8.0+),用 ?? 或 isset 提前判斷。
輸出後再發響應頭
已輸出內容後 header() 會失敗,先開啓緩衝或先發響應頭。
empty 與 isset
empty 對 0、''、'0' 等都返回 true,isset 只關心是否為 null,選擇要合語義。
SQL 注入防護
拼接 SQL 字符串有注入風險,用 PDO 預處理參數綁定。
14.併發與協程
PHP 的併發模型:多進程、協程、Fiber 與第三方擴展。
進程模型
PHP 默認單線程,每請求獨立進程執行,變量隨請求釋放。
pcntl_fork 多進程
pcntl_fork 派生子進程,父子進程各自執行,僅 CLI 可用。
信號處理
pcntl_signal 註冊信號處理器,dispatch 派發掛起信號。
parallel 擴展
parallel 是 PECL 擴展,提供真正的多線程 worker,非內置。
Swoole 協程
Swoole 高性能網絡框架,協程調度 + 常駐內存,適合高併發。
Fiber 協程
Fiber(8.1+)原生協程,suspend 掛起、resume 恢復,手動調度。
異步庫
無內置 async/await,用 ReactPHP、Amp 等事件循環庫實現異步。
進程間通信
多進程共享數據走消息隊列、文件或共享內存,避免直接改同一文件。
15.網絡
HTTP 客户端、curl、URL 解析、會話與套接字。
HTTP 請求
file_get_contents 發簡單請求,stream_context_create 配超時與頭部。
curl 擴展
curl_init + curl_exec 完整控制請求,讀狀態碼與錯誤信息。
POST 與 Guzzle
stream_context 發 POST JSON,工程實踐優先用 Guzzle 客户端。
請求與響應頭
header() 發送響應頭,http_response_code 設狀態碼,須在輸出前調用。
URL 解析
parse_url 拆解 URL 各組件,parse_str 解析查詢串,http_build_query 拼接。
Cookie 與 Session
session_start 啓動會話,setcookie 寫 cookie,$_COOKIE 讀取。
Socket 套接字
stream_socket_client 連接遠程,fwrite 發送、fgets 讀取。
SSE 與 WebSocket
SSE 單向文本推送,WebSocket 雙向通信,按需選擇。
16.日期與時間
時間戳、格式化、解析、時區與時間運算。
獲取當前時間
time() 得秒級時間戳,microtime 得毫秒級,date 格式化。
格式化日期
date() 用格式符渲染時間戳,支持年月日時分秒與本地化寫法。
解析日期
strtotime 解析日期文本與相對時間,失敗返回 false。
時間戳
Unix 時間戳是 UTC 秒數,DateTime 提供時間戳與對象互轉。
時區
date_default_timezone_set 設默認時區,DateTime 可帶獨立時區。
時間間隔
DateInterval 表示時長,DateTime add/sub 加減間隔。
時間差計算
DateTime diff 返回 DateInterval,可讀年齡、剩餘天數等。
休眠與定時器
sleep 阻塞暫停,事件循環定時器可非阻塞調度延時任務。
17.進程與 CLI
命令行參數、輸入輸出、環境變量與進程控制。
命令行參數
$argv 數組存放命令行參數,$argv[0] 是腳本名。
讀取輸入
fgets(STDIN) 讀一行,stream_get_contents 讀全部,trim 去換行。
執行外部命令
shell_exec 取輸出,exec 取狀態碼,傳參用 escapeshellarg 防注入。
環境變量
getenv 讀取環境變量,putenv 設置,敏感配置走環境變量。
進程信息
getmypid 取當前 PID,posix_* 系列查用户與父進程,hrtime 計時。
進程信號
pcntl_signal 控制信號處理,pcntl_wait 等待子進程退出。
管道與終端
stream_isatty 判斷交互終端,stderr 輸出進度,exit 控制退出碼。
退出碼
exit() 傳退出碼,0 成功非 0 失敗,shell 用 $? 讀取。
18.正則表達式
匹配、捕獲、替換、拆分與多字節模式。
preg_match
preg_match 匹配首個結果,捕獲組存進 $m,命名組按名取。
preg_match_all
匹配所有結果,默認按組分組,PREG_SET_ORDER 按匹配分組。
preg_replace
按正則替換,用 $1 回引用捕獲組,preg_replace_callback 回調處理。
常用模式
字符類、量詞與貪婪匹配,正則分隔符與轉義規則。
捕獲與斷言
捕獲組、非捕獲組、命名組與前後斷言。
錨點與邊界
^ 行首 $ 行尾,\b 詞邊界,m 修飾符多行匹配。
正則拆分
preg_split 按正則拆字符串,可保留分隔符與限制數量。
多字節與 u 修飾符
處理中文加 u 修飾符,preg_quote 轉義用户輸入。
19.構建與工具鏈
Composer 依賴管理、自動加載與 CLI 構建流程。
初始化項目
composer init 生成 composer.json,聲明依賴與自動加載規則。
安裝依賴
composer install 按 lock 安裝,require 添加新依賴。
引入依賴
require vendor/autoload.php 後即可 use 依賴類,自動加載生效。
PSR-4 自動加載
命名空間與目錄一一對應,App\ 映射到 src/,需 dump-autoload。
Composer 腳本
composer.json scripts 定義命令別名,支持安裝鈎子回調。
版本約束
^、~、>= 等約束語法控制依賴版本範圍,lock 鎖精確版。
CLI 發佈命令
框架命令(artisan / console)執行遷移、緩存與定時任務。
PHP 配置
php -i / php --ini / php -m 檢查運行時,ini_get 查詢配置。
關於本速查
本頁是 PHP 8.3 的自包含速查手冊,覆蓋語言核心與最常用標準庫在真實項目中約 80% 的常見用法。內容偏向現代慣用法:declare(strict_types=1) 嚴格模式、enum 枚舉、readonly 只讀屬性、match 表達式、命名參數、箭頭函數與 first-class callable。權威參考見官方 PHP 手冊與 PHP The Right Way。 19 個章節各自聚焦一個主題——從第一個程序到數組、面向對象與常見誤區。每節拆成 8–14 個帶示例的小節(每個 5–20 行),共約 150 個主題。代碼片段刻意短小、自解釋。 所有處理都在瀏覽器中完成——無上傳、無追蹤。本頁是 GuruToolkit 免費開發者工具集的一部分;代碼片段可自由使用,無任何擔保。
版本 2.1.0