1. 程式人生 > >ThinkPHP--initialize()方法

ThinkPHP--initialize()方法

       最近部門趕專案在做一個微商城,在做後臺時,做使用者資訊功能這塊,出現一個問題,就是在public/header 檔案中,需要在頭部顯示使用者姓名和狀態,底層寫了個base控制器,控制器中判斷使用者是否登入,並將使用者資訊assign到頁面,所有(除了login)控制器都繼承這個base控制器,但在渲染時,發現所有模組下都無法識別username ,想來想去,一直找不到原因,後來,突然靈機一動,發現父類base控制器和子控制器中都有一個_initialize()這個建構函式,理論上說,若子類中方法與父類中的方法同名,在子類中是會過載這個方法的,所以,之前assign 的username變數所在的方法一遍過載,根本不存在,要想使 兩個同名方法都起作用,需要在子類_initialize()方法中新增:

parent::_initialize();

舉個例子:

建立的FatherAction.class.php檔案

<?php

class FatherAction extends Action{
  public function __construct(){
    echo 'father';
  }
}

?>

建立的SonAction.class.php檔案

<?php

class SonAction extends FatherAction{
  public function __construct(){
    echo 'son';
  }
    function index(){

    }
}

?>

執行子類SonAction裡的index()可以看到輸出的結果:

son

如果將子類改為:

<?php

class SonAction extends FatherAction{
   public function __construct(){
    parent::__construct();
    echo 'son';
   }
  function index(){

  }
}

?>

執行結果為;

fatherson

上面的結果可以得出結論:

在執行子類的建構函式時並不會自動呼叫父類的建構函式,如果你要呼叫的話,那麼要加上parent::__construct()

當我們把上述的構造方法改為THINKPHP_initialize()方法時執行會發現:結果與前面的一致,若要執行父類的_initialize()方法,也需要使用這一句:

parent::_initialize()