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

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

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

如下:我贴出部分代码:

class Admin extends CommonMethod
{
    private $adminModel;
    public function  _initialize(){
        $this->adminModel=new AdminModel();
    }
}
<?php

namespace app\admin\controller;
use think\Controller;

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 app\admin\controller;
use think\Controller;

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()是什么呢?

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