Thinkphp5.0 在自己定義一個公共方法的控制器並且繼承了Controller類的時候報錯


在建立網站的時候,你通常想着把一些共有的方法提取出來,放入一個控制器內,如果你是將業務邏輯寫入了構造函數里面,那么就得注意了。

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

其實他表示要執行父類的構造函數,此時即使父類的構造函數被子類的覆蓋掉了。因為有這句代碼的實現,父類的構造函數也會被執行,就不會報錯了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM