PHP 8.3 是 PHP 语言的最新版本,延续了现代 PHP 的高效与类型安全方向。本文分类整理其核心更新,帮助开发者快速掌握关键内容。
类型系统增强
类型化类常量(Typed Class Constants)
允许为类常量(包括接口和 trait 中的常量)指定显式类型:
class User {
const string STATUS_ACTIVE = 'active'; // 类型声明
}
interface Logger {
public const int MAX_LOG_LENGTH = 1000; // 接口中的类型化常量
}更灵活的 json_validate() 函数
新增原生 JSON 验证函数,无需解析完整内容,性能更优:
if (json_validate($jsonString)) {
// 有效 JSON
}新函数与工具
mb_str_pad() 多字节字符串填充
支持多字节字符(如中文、Emoji)的字符串填充:
echo mb_str_pad("你好", 10, "~", STR_PAD_RIGHT); // 输出:你好~~~~~~Randomizer::getBytesFromString()
从指定字符串中随机生成字节序列:
use Random\Randomizer;
$randomizer = new Randomizer();
echo $randomizer->getBytesFromString('abcdef123', 5); // 如 "b1dfa"DOMElement::getAttributeNames()
获取 DOM 元素的所有属性名:
$dom = new DOMDocument();
$dom->loadHTML('<div id="main" class="box"></div>');
$element = $dom->getElementsByTagName('div')[0];
print_r($element->getAttributeNames()); // 输出 ['id', 'class']语法改进
动态类常量获取(::class 支持动态名称)
允许通过变量获取类常量名:
const STATUS = 'ACTIVE';
echo User::{'STATUS_' . STATUS}; // 等价于 User::STATUS_ACTIVE只读属性深拷贝(Deep Cloning of Readonly Properties)
在 __clone 方法中可修改 readonly 属性的内部状态:
class User {
public readonly array $roles;
public function __clone() {
$this->roles[] = 'CLONED'; // PHP 8.3 允许此操作
}
}性能与底层改进
JIT 编译优化
针对数学计算和密集循环的即时编译(JIT)性能提升,适合科学计算和框架核心。
GC(垃圾回收)效率提升
减少内存占用,优化长期运行脚本的稳定性。
弃用与破坏性变更
移除 assert() 字符串参数
禁止将字符串作为 assert() 的参数:
assert('1 === 2'); // PHP 8.3 报错,需改为表达式:assert(1 === 2);移除 U_MULTIPLE_DECIMAL_SEPARATORS 常量
与 ICU 库相关的常量清理。
动态属性创建警告升级
未声明属性的动态赋值将触发 E_DEPRECATED 警告(PHP 8.2 开始,PHP 9.0 将转为错误):
class User {}
$user = new User();
$user->undefinedProp = 1; // PHP 8.3 警告其他实用更新
#[\Override]属性:显式标记覆盖父类方法,避免意外重命名导致的错误。更清晰的日期错误消息:日期解析错误提示更友好。
新 INI 配置选项:
zend.max_allowed_stack_size控制调用栈深度。
总结:是否升级到 PHP 8.3?
✅ 推荐升级场景
需要类型化类常量或新工具函数(如
json_validate)。项目依赖现代类型系统与性能优化。
⚠️ 注意事项
检查代码中是否使用了废弃功能(如
assert字符串参数)。确保第三方库已兼容 PHP 8.3。
官方升级指南:PHP 8.3 Migration Guide