• Thinkphp5.0 在自己定义一个公共方法的控制器并且继承了Controller类的时候报错


    在建立网站的时候,你通常想着把一些共有的方法提取出来,放入一个控制器内,如果你是将业务逻辑写入了构造函数里面,那么就得注意了。

    在thinkphp5.0当中,有一个初始化的方法,类似于构造函数,那就是_initialize()。

    但是如果你在父类和子类当中同时使用该方法时,会将父类的_initialize()方法覆盖掉。

    如下:我贴出部分代码:

    class Admin extends CommonMethod
    {
        private $adminModel;
        public function  _initialize(){
            $this->adminModel=new AdminModel();
        }
    }
    <?php
    
    namespace appadmincontroller;
    use thinkController;
    
    class CommonMethod extends Controller
    {
        public function _initialize(){
            if(!session("username") || !session("id")){
                $this->error("您尚未登录!","Login/index");
            }
        }
    }

    如上,我的Admin类继承了CommonMethod类,同时CommonMethod类也继承了Controller类。而我的Admin和Common类都有初始化方法_initialize()方法,此时如果你想要执行CommonMethod的_initialize()方法是不可行的,那么怎么办呢?

    解决方案如下:

    class Admin extends CommonMethod
    {
        private $adminModel;
        public function  _initialize(){
            $this->adminModel=new AdminModel();
        }
    }
    <?php
    
    namespace appadmincontroller;
    use thinkController;
    
    class CommonMethod extends Controller
    {
        public function __construct(){
            parent::__construct();
            if(!session("username") || !session("id")){
                $this->error("您尚未登录!","Login/index");
            }
        }
    }

    如上所示,我在CommonMethod里面采用了__construct()构造方法,这样就不会出现覆盖的情况了。

    请一定注意:

    如上所示,Controller类同样含有__construct()方法,此时子类CommonMethod如果不写parent::__construct()方法的话,同样会将父类的__construct()方法覆盖掉。

    那么parent::_construct()是什么呢?

    其实他表示要执行父类的构造函数,此时即使父类的构造函数被子类的覆盖掉了。因为有这句代码的实现,父类的构造函数也会被执行,就不会报错了。

  • 相关阅读:
    Vue框架构造
    JavaScript-改变this指向
    前端发展史
    python篇第10天【For 循环语句】
    python篇第10天【While 循环语句】
    python篇第8天【运算符】
    python篇第6天【数据类型】
    python篇第5天【变量】
    Python篇函数总结【输出函数】
    python篇第3天【编码规范】
  • 原文地址:https://www.cnblogs.com/hzStudy/p/7587422.html
Copyright © 2020-2023  润新知