报错根源
PHP 8.2 新增严格属性校验:禁止给类对象动态创建未提前声明的属性
低版本 PHP(5.x~8.1)允许写法:
php
运行
class User {}
$u = new User();
$u->name = "张三"; // PHP8.2直接抛出 Creation of dynamic property 警告/错误
PHP8.2 默认触发 E_DEPRECATED 弃用告警;如果项目开启了错误拦截、日志上报、严格报错模式,就会直接程序异常、Nginx FastCGI 抛出日志报错。
三种修复方案(按推荐优先级排序)
方案 1:标准根治(推荐,规范代码,长期维护首选)
给类里提前定义所有要使用的属性
php
运行
// 修改前
class Test {
}
$obj = new Test();
$obj->title = "内容";
// 修改后
class Test {
public string $title; // 预先声明属性
}
$obj = new Test();
$obj->title = "内容";
方案 2:类内开启动态属性兼容(少量老旧类快速适配)
使用 #[AllowDynamicProperties] 注解标记类,放开动态属性权限,兼容旧逻辑无需大面积改代码
php
运行
#[AllowDynamicProperties]
class Test {
// 无需提前写所有属性,可继续动态赋值
}
适合:老旧开源程序、大量历史遗留代码不方便逐行改造场景
方案 3:全局关闭该校验(临时应急,不建议长期用)
修改 php.ini 配置,关闭动态属性弃用提醒
- 打开
php.ini找到配置项:
ini
# 修改为关闭弃用警告
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
- 或者单独屏蔽该类告警(PHP8.2 专属配置):
ini
deprecated_warnings = Off
- 重启 php-fpm 生效
bash
# CentOS/RHEL
systemctl restart php-fpm
# Debian/Ubuntu
systemctl restart php8.2-fpm
额外补充:框架常见场景适配
1. ThinkPHP 老版本(5.0/5.1)升级 PHP8.2 必现此错
解决:
- 升级 ThinkPHP 到 6.x 正式版
- 或者给底层模型基类
Model加上#[AllowDynamicProperties]
2. Laravel 旧版本
Laravel 9+ 已原生适配 PHP8.2;Laravel8 及以下需要升级框架,或给自定义模型添加动态属性注解。
排查小技巧
查看完整 PHP 错误堆栈日志,定位具体哪个类触发:
打开 php-fpm 错误日志文件,日志里会完整打印:
Creation of dynamic property 类名::$属性名 is deprecated
就能精准找到出错代码位置。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)