搜尋
首頁php框架ThinkPHP理解thinkphp中的__construct()和__initialize()

理解thinkphp中的__construct()和__initialize()

關於thinkphp中的__construct()和_initialize()的理解

網路上有很多的說法和用法,自己測試了一下,以下是根據測試結果並結合自己的理解得出的結論,如有不對的地方,歡迎大家糾正! ! !

我們先來看看Thinkphp自帶的Controlle類別的內容(ThinkPHP\Library\Think\Controller.class.php)

看看建構子:

/**

     * 架构函数 取得模板对象实例

     * @access public

     */

    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方法,

因此,如果我們在自己定義的控制器中,

1):有重寫建構子:

①在重寫的建構子中有實作父類別的建構子(parent::construct() ),

如果該控制器中有定義_initialize()方法,那麼,我們在呼叫該控制器中的方法時,會先執行_initialize()方法,然後再執行我們需要的方法,看程式碼:

<?php

namespace Home\Controller;

use Think\Controller;

class IndexController extends Controller {

  

    public function __construct() {

        parent::__construct();

        self::b();

        echo &#39;我是构造<br />&#39;;

    }

    public function _initialize() {

        echo &#39;我先来<br />&#39;;

        // parent::_initialize();

    }

    public function index(){

        self::b();

        echo &#39;这是index&#39;;

    }

  

    public function b() {

        echo &#39;bbbb<br />&#39;;

    }

}

  

/*

当执行index方法时,打印结果:

我先来

bbbb

我是构造

bbbb

这是index

*/

②:在重寫的建構中沒有實作父類別的建構函數,執行方法時,定義的_initialize()方法則沒有作用(不會在執行方法時,先執行_initialize方法),看程式碼:

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
  
 public function __construct() {
 // parent::__construct();
 self::b();
 echo &#39;我是构造<br />&#39;;
 }
 public function _initialize() {
 echo &#39;我先来<br />&#39;;
 // parent::_initialize();
 }
 public function index(){
 self::b();
 echo &#39;这是index&#39;;
 }
  
 public function b() {
 echo &#39;bbbb<br />&#39;;
 }
}
  
/*
当执行index方法时,打印结果:
bbbb
我是构造
bbbb
这是index
*/

註:這裡面的所說的先執行_initialize()方法,是在parent::__construct();前沒有任何函數調用,如果你非得在parent:: __construct();前來個self::b(),那沒得說,肯定是先執行b(),不過一般不這樣寫,在實現父類的構造函數前一般沒有任何輸出和配置

再有,如果是繼承,如果父類別有建構函數,子類別在其建構函數一般先把父類別的建構子先初始化,確保程式碼的原始性和完整性

2)沒有重寫建構函數,也就是說在我們定義的控制器中沒有宣告建構子

這種情況,如果在控制器中有定義_initialize()方法,則當我們呼叫其他方法時,會先呼叫_initialize()方法,看程式碼:

<?php

namespace Home\Controller;

use Think\Controller;

class IndexController extends Controller {

  

    // public function __construct() {

    //  // parent::__construct();

    //  self::b();

    //  echo &#39;我是构造<br />&#39;;

    // }

    public function _initialize() {

        echo &#39;我先来<br />&#39;;

        // parent::_initialize();

    }

    public function index(){

        self::b();

        echo &#39;这是index&#39;;

    }

  

    public function b() {

        echo &#39;bbbb<br />&#39;;

    }

}

  

/*

当执行index方法时,打印结果:

我先来

bbbb

这是index
*/

另外,_initialize()還可以用來繼承

<?php

namespace Home\Controller;

use Think\Controller;

class BaseController extends Controller {

    public function __construct() {

        parent::__construct();

  

        echo &#39;我是父类<br />&#39;;

    }

  

    public function _initialize() {

        echo &#39;我先来<br />&#39;;

    }

  

    public function a() {

        echo &#39;aaaa<br />&#39;;

    }

}
<?php

namespace Home\Controller;

use Think\Controller;

class IndexController extends BaseController {

  

    public function __construct() {

        parent::__construct();

        self::b();

        echo &#39;我是构造<br />&#39;;

    }

    public function _initialize() {

        parent::_initialize();

        echo &#39;我是子类先来<br />&#39;;

    }

    public function index(){

        self::b();

        echo &#39;这是index&#39;;

    }

  

    public function b() {

        echo &#39;bbbb<br />&#39;;

    }

}

  

/*

当执行index方法时,打印结果:

我先来

我是子类先来

我是父类

bbbb

我是构造

bbbb

这是index
*/

注意:如果父類別的建構子中沒有parent:: construct(),定義的_initialize()也不起作用

那麼,同時存在__construct()(該建構函式初始化了父類別的建構子)和_initialize() ,到底先執行哪個呢?

答案是-先執行_initialize()方法,也就是說,在滿足條件下,_initialize()函數是在任何方法執行之前,都要執行的,包括建構函數,

當然,如果你在要執行的方法中又呼叫的另一個或多個方法,在另外呼叫那些方法時,_initialize()方法是不會再執行了,它關聯的是你第一次呼叫的方法,也就是說,方法裡面幹什麼,它管不著了。

推薦教學:《thinkphp框架

以上是理解thinkphp中的__construct()和__initialize()的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具