PHP8.2严格执行属性声明,ThinkPHP5.1项目因动态属性报弃用警告。建议升级至v5.1.42+解决;或为报错类添加`#[AllowDynamicProperties]`属性临时适配。
Deprecated: Creation of dynamic property 警告,尤其是在 Model、Request 等核心类实例化时。这是因为 PHP 8.2 开始严格执行属性声明规则,所有“使用时创建”的动态属性写法均被标记为弃用。虽然代码逻辑本身不会出错,但这些警告会严重干扰调试、污染日志,线上环境也难以承受。
那么,如何确认问题就出在这里?
很简单,在项目入口文件 public/index.php 最顶部临时加上两行代码:
error_reporting(E_ALL);
ini_set('display_errors', '1');
然后刷新页面,如果报错信息中明确出现 Creation of dynamic property 字样,并附带具体的类名和属性名(例如 thinkRequest::$param),则基本锁定问题。如果报错信息出现的是 array_key_exists()、mbstring.func_overload 或 $str{0} 等关键词,则不在本文讨论范围内。
composer update topthink/framework:^5.1.42
在此之前,务必确保 composer.json 文件中 require 区块的版本号已修改为 "topthink/framework": "^5.1.42"。
升级前必须删掉 runtime/ 目录,否则旧缓存中的类定义可能被加载,新代码不会生效。
升级完成后,再次访问接口验证。运行 php think version,输出应为 v5.1.42 或更高版本。同时,使用 grep -r "\$.* =" vendor/topthink/thinkphp/library/think/ 检查,如果返回结果中不再有大量未声明属性的赋值语句,则说明修复成功。
app/model/BaseModel.php 文件(若无则新建),在类定义开头添加:
protected $data = [];
然后在构造函数中初始化:
public function __construct($data = []) {
$this->data = $data;
parent::__construct();
}
之后所有字段的读写操作改为 $this->data['name'] 形式,而非 $this->name,从而绕过 PHP 8.2 对 $this->name 的动态属性检查。
方法二:为特定类添加 #[AllowDynamicProperties] 属性#[AllowDynamicProperties]。例如修改 vendor/topthink/thinkphp/library/think/Model.php 文件,紧跟在 后面:
#[AllowDynamicProperties]
注意:这是直接修改 vendor 目录中的文件,下次执行 composer update 会被覆盖。建议配合 composer patch 插件,或单独 fork 一个维护分支进行管理。
方法三:关闭模型动态属性支持
在模型类中增加两个属性:
protected $strict = true;
protected $schema = ['id', 'name', 'email'];
将模型使用的所有字段声明在 $schema 数组中,未在数组中定义的属性赋值操作会被直接忽略,从而避免触发警告。
此方式最为安全,但要求对模型字段完全了解,且每新增一个字段均需同步更新 $schema 数组。
检查并修正自定义类中的动态属性用法
框架层面的问题处理完毕后,还需清理项目中所有自定义类中的动态属性写法。
第一步:全局搜索所有使用 $this-> 后接未声明变量名的赋值语句。Linux 下可使用以下命令:
grep -r "\$this->[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*=" app/ --include="*.php" | grep -v "protected|private|public"
第二步:对每个匹配结果,找到对应的类定义,在类属性区域补上显式声明。例如将 $this->user_info = []; 改为 protected $user_info = [];。
第三步:检查控制器、中间件等其他类中是否也有类似 $this->cache_key = 'xxx'; 的写法,一律改为 protected $cache_key;,并在构造函数中完成初始化。
完成以上步骤后,所有自定义类中的动态属性警告即被清除。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述