zoukankan      html  css  js  c++  java
  • PHP系列 | 代码复用trait的构造函数使用

    在ThinkPHP5.1 框架中自己封装了一个 trait 类,每次都在控制器中使用,但是在使用框架自身的验证器类(框架控制器方法)报错

    在控制器中使用自定义验证器

    $param = $this->request->post();
    $result = $this->validate($param, LiveValidate::class);
    if (true !== $result) {
        return response_json(1, $result);
    }

    日志错误信息:

    [ 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自带控制器)

    class MyBaseController
    {
        /**
         * MyBaseController constructor.
         */
        public function __construct()
        {
            echo " MyBaseController基类构架方法<br/>";
        }
    
        /**
         * @desc: 基类-验证器
         */
        public function validate()
        {
            echo "基类-验证器 <br/>";
        }
    }
    

     自定义trait 类

    trait MyTrait
    {
        protected $var = "MyTrait_var";
    
        /**
         * MyTrait constructor.
         */
        function __construct()
        {
            parent::__construct();
            echo "MyTrait 构架方法 <br/>";
        }
    
        /**
         * @desc: 添加
         */
        function create()
        {
            echo "MyTrait create方法 <br/>";
        }
    }
    

     控制器子类,继承控制器父类 MyBaseController  

    class MyBaseController
    {
        /**
         * MyBaseController constructor.
         */
        public function __construct()
        {
            echo " MyBaseController基类构架方法<br/>";
        }
    
        /**
         * @desc: 基类-验证器
         */
        public function validate()
        {
            echo "基类-验证器 <br/>";
        }
    }
    

     调用控制器子类

    public function traitsDemo()
    {
        $obj = new MyController();
        var_dump($obj->validate());
        var_dump($obj->create());
        var_dump($obj->hello());
    }
    

     打印结果

    MyBaseController基类构架方法
    
    MyTrait 构架方法
    
    基类-验证器
    
    MyTrait create方法
    
    MyController 子类 hello方法
  • 相关阅读:
    《淘宝网》之系统质量属性分析
    《架构漫谈》读后感 之“关于软件架构师如何工作”
    《软件需求》读后感06
    《软件需求》读后感05
    Cforeach的详细用法--【转】
    事件(Event)(onclick,onchange,onload,onunload,onfocus,onblur,onselect,onmuse)【转载】
    十七、Mysql的主从(一)--主从原理
    十七、Mysql的主从(二)--主从复制部署
    十六、mysql的备份与恢复(三)--xtrabackup(XBK、Xbackup)
    十六、mysql的备份与恢复(二)--mysqldump
  • 原文地址:https://www.cnblogs.com/tinywan/p/12048120.html
Copyright © 2011-2022 走看看