PHP系列 | 代码复用trait的构造函数使用
在ThinkPHP5.1 框架中自己封装了一个 trait 类,每次都在控制器中使用,但是在使用框架自身的验证器类(框架控制器方法)报错
在控制器中使用自定义验证器
1 2 3 4 5 | $param = $this ->request->post(); $result = $this ->validate( $param , LiveValidate:: class ); if (true !== $result ) { return response_json(1, $result ); } |
日志错误信息:
1 | [ error ] [0]致命错误: Call to a member function validate() on null [/ var /www/www.tinywan.com/thinkphp/library/think/Controller.php:251] |
以上错误就是由于应用了自定义的 trait 类导致的,如果移除该 trait 类则不会报错,加入以后就会报错。、
原因分析:
为何调用不了父类的控制器方法。由于自定义 trait 类 没有继承框架的构架方法。
解决办法:
在trait 类的构架方法中,继承父类的构架方法,解决问题
测试案例
基类控制器(模拟TP自带控制器)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class MyBaseController { /** * MyBaseController constructor. */ public function __construct() { echo " MyBaseController基类构架方法<br/>" ; } /** * @desc: 基类-验证器 */ public function validate() { echo "基类-验证器 <br/>" ; } } |
自定义trait 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | trait MyTrait { protected $var = "MyTrait_var" ; /** * MyTrait constructor. */ function __construct() { parent::__construct(); echo "MyTrait 构架方法 <br/>" ; } /** * @desc: 添加 */ function create() { echo "MyTrait create方法 <br/>" ; } } |
控制器子类,继承控制器父类 MyBaseController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class MyBaseController { /** * MyBaseController constructor. */ public function __construct() { echo " MyBaseController基类构架方法<br/>" ; } /** * @desc: 基类-验证器 */ public function validate() { echo "基类-验证器 <br/>" ; } } |
调用控制器子类
1 2 3 4 5 6 7 | public function traitsDemo() { $obj = new MyController(); var_dump( $obj ->validate()); var_dump( $obj ->create()); var_dump( $obj ->hello()); } |
打印结果
1 2 3 4 5 6 7 8 9 | MyBaseController基类构架方法 MyTrait 构架方法 基类-验证器 MyTrait create方法 MyController 子类 hello方法 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构