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