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方法
posted @   Tinywan  阅读(1591)  评论(0编辑  收藏  举报
编辑推荐:
· 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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示