最近在模仿寫一個權限管理系統,其中在繼承AuthController中用到了_initialize。php
class AuthController extends Controller { protected function _initialize(){ } }
首先,_initialize並不是php類中的函數,它是由Think\Controller.class.php實現的一個構造函數方法
咱們看看源碼函數
public function __construct() { Hook::listen('action_begin',$this->config); //實例化視圖類 $this->view = Think::instance('Think\View'); //控制器初始化 if(method_exists($this,'_initialize')) $this->_initialize(); }
從上面能夠看出在實例化父類的Controller後,若是子類中存在_initialize方法時,則執行。
此時_initialize至關於子類的構造函數。this
那麼子類中可不能夠用__construct充當構造函數呢?
當在子類中使用__construct的時候,至關於重載了父類的 __construct方法,故父類的構造函數不執行。
因此在子類中要加載父類的構造函數。code
class AuthController extends Controller{ public function __construct(){ parent::__construct(); }
經過使用_initialize方法來簡化從父類執行構造函數的步驟以及避免忘了初始化父類的執行函數。繼承
咱們接下來看一下當父類和子類都有_initialize的狀況源碼
AuthController.class.php class AuthControlle extends Controller { public function _initialize(){ $parent ='parent'; $this->assign('parent',$parent); } } IndexController.class.php class IndexController extends AuthController{ public function _initialize() { parent::_initialize(); } public function index(){ $child = "child"; $this->assign('child',$child); $this->display(); } }
頁面同時輸出了parent和child,其中雖然IndexController重載了父類AuthController中的_initialize,但在自身的_initialize中加載了父類的靜態方法,故會輸出parent,不能寫成parent:_construct, 會引發500錯誤。it