在建立網站的時候,你通常想着把一些共有的方法提取出來,放入一個控制器內,如果你是將業務邏輯寫入了構造函數里面,那么就得注意了。
在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()是什么呢?
其實他表示要執行父類的構造函數,此時即使父類的構造函數被子類的覆蓋掉了。因為有這句代碼的實現,父類的構造函數也會被執行,就不會報錯了。