_initialize() 區別 __construct()

  • _initialize()方法是在任何方法執行以前,都要執行的,固然也包括 __construct構造函數。 也就是說若是存在_initialize()函數,調用對象的任何方法都會致使_initialize()函數的自動調用,而__construct()構造函數僅僅在建立對象的時候調用一次,跟其它方法調用沒有關係。
  • __construct這裏是雙劃線,而_initialize()函數是單劃線
  • 若是父子類均有_initialize()函數,則子類覆蓋了父類的,若是子類沒有而父類有,則子類繼承父類的。
  • 默認狀況下,子類的構造函數不會自動調用父類的構造函數。在調用子類對象的_initialize()時,也不會致使自動調用父類的_initialize()
  • 實際編寫子類的構造函數時,通常都要加上父類構造函數的主動調用parent::__construct(),不然會致使子類對象空指針的異常,如Call to a member function assign() on a non-object。

故在一些系統後臺管理或者評論功能上,可以使相關的控制器extends於base控制器:php

Base.php:session

<?php
namespace app\admin\controller;
use think\Controller;
class Base extends Controller
{
    public function _initialize(){
        if(!session('username')){
            $this->error('請先登陸系統!','Login/index');
        }
    }
}

Article.phpapp

<?php
namespace app\Admin\controller;
use app\Admin\model\Article as ArticleModel;
use app\admin\controller\Base;
class Article extends Base
{
   ……… ………
}

這樣一來,當Article控制器的任何方法執行前都會先執行Base.php中的_initialize()方法進行檢測是否已經登陸,無需建立對象。函數

相關文章
相關標籤/搜索