PHP8.2 报错:Creation of dynamic property 完整解决方案

5次阅读
没有评论

报错根源

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 配置,关闭动态属性弃用提醒

  1. 打开 php.ini 找到配置项:

ini

# 修改为关闭弃用警告
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
  1. 或者单独屏蔽该类告警(PHP8.2 专属配置):

ini

deprecated_warnings = Off
  1. 重启 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)
post-qrcode
 0
评论(没有评论)
验证码