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

關(guān)于thinkphp中的__construct()和_initialize()的理解

創(chuàng)新互聯(lián)建站長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為五華企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、做網(wǎng)站,五華網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

網(wǎng)上有很多的說法和用法,自己測試了一下,下面是根據(jù)測試結(jié)果并結(jié)合自己的理解得出的結(jié)論,如有不對的地方,歡迎大家糾正?。?!

我們先看一下Thinkphp自帶的Controlle類的內(nèi)容(ThinkPHP\\Library\\Think\\Controller.class.php)

看一下構(gòu)造函數(shù):

/**

     * 架構(gòu)函數(shù) 取得模板對象實例

     * @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類中的構(gòu)造函數(shù)中可以知道,該構(gòu)造函數(shù)會判斷對象中是否有_initialize方法,如果有,就執(zhí)行先_initialize方法,

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

1):有重寫構(gòu)造函數(shù):

①在重寫的構(gòu)造中有實現(xiàn)父類的構(gòu)造函數(shù)(parent::construct() ),

如果該控制器中有定義_initialize()方法,那么,我們在調(diào)用該控制器中的方法時,會先執(zhí)行_initialize()方法,然后再執(zhí)行我們需要的方法,看代碼:

<?php

namespace Home\\Controller;

use Think\\Controller;

class IndexController extends Controller {

  

    public function __construct() {

        parent::__construct();

        self::b();

        echo '我是構(gòu)造<br />';

    }

    public function _initialize() {

        echo '我先來<br />';

        // parent::_initialize();

    }

    public function index(){

        self::b();

        echo '這是index';

    }

  

    public function b() {

        echo 'bbbb<br />';

    }

}

  

/*

當(dāng)執(zhí)行index方法時,打印結(jié)果:

我先來

bbbb

我是構(gòu)造

bbbb

這是index

*/

②:在重寫的構(gòu)造中沒有實現(xiàn)父類的構(gòu)造函數(shù),執(zhí)行方法時,定義的_initialize()方法則沒有作用(不會在執(zhí)行方法時,先執(zhí)行_initialize方法),看代碼:

<?php
namespace Home\\Controller;
use Think\\Controller;
class IndexController extends Controller {
  
 public function __construct() {
 // parent::__construct();
 self::b();
 echo '我是構(gòu)造<br />';
 }
 public function _initialize() {
 echo '我先來<br />';
 // parent::_initialize();
 }
 public function index(){
 self::b();
 echo '這是index';
 }
  
 public function b() {
 echo 'bbbb<br />';
 }
}
  
/*
當(dāng)執(zhí)行index方法時,打印結(jié)果:
bbbb
我是構(gòu)造
bbbb
這是index
*/

注:這里面的所說的先執(zhí)行_initialize()方法,是在parent::__construct();前沒有任何函數(shù)調(diào)用,如果你非得在parent::__construct();前來個self::b(),那沒得說,肯定是先執(zhí)行b(),不過一般不這樣寫,在實現(xiàn)父類的構(gòu)造函數(shù)前一般沒有任何輸出和配置

再有,如果是繼承,如果父類有構(gòu)造函數(shù),子類在其構(gòu)造函數(shù)一般先把父類的構(gòu)造函數(shù)先初始化,確保代碼的原始性和完整性

2)沒有重寫構(gòu)造函數(shù),也就是說在我們定義的控制器中沒有聲明構(gòu)造函數(shù)

這種情況,如果在控制器中有定義_initialize()方法,則當(dāng)我們調(diào)用其他方法時,會先調(diào)用_initialize()方法,看代碼:

<?php

namespace Home\\Controller;

use Think\\Controller;

class IndexController extends Controller {

  

    // public function __construct() {

    //  // parent::__construct();

    //  self::b();

    //  echo '我是構(gòu)造<br />';

    // }

    public function _initialize() {

        echo '我先來<br />';

        // parent::_initialize();

    }

    public function index(){

        self::b();

        echo '這是index';

    }

  

    public function b() {

        echo 'bbbb<br />';

    }

}

  

/*

當(dāng)執(zhí)行index方法時,打印結(jié)果:

我先來

bbbb

這是index
*/

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

<?php

namespace Home\\Controller;

use Think\\Controller;

class BaseController extends Controller {

    public function __construct() {

        parent::__construct();

  

        echo '我是父類<br />';

    }

  

    public function _initialize() {

        echo '我先來<br />';

    }

  

    public function a() {

        echo 'aaaa<br />';

    }

}
<?php

namespace Home\\Controller;

use Think\\Controller;

class IndexController extends BaseController {

  

    public function __construct() {

        parent::__construct();

        self::b();

        echo '我是構(gòu)造<br />';

    }

    public function _initialize() {

        parent::_initialize();

        echo '我是子類先來<br />';

    }

    public function index(){

        self::b();

        echo '這是index';

    }

  

    public function b() {

        echo 'bbbb<br />';

    }

}

  

/*

當(dāng)執(zhí)行index方法時,打印結(jié)果:

我先來

我是子類先來

我是父類

bbbb

我是構(gòu)造

bbbb

這是index
*/

注意:如果父類的構(gòu)造函數(shù)中沒有parent::construct(),定義的_initialize()也不起作用

那么,同時存在__construct()(該構(gòu)造函數(shù)初始化了父類的構(gòu)造函數(shù))和_initialize() ,到底先執(zhí)行哪個呢?

答案是——先執(zhí)行_initialize()方法,也就是說,在滿足條件下,_initialize()函數(shù)是在任何方法執(zhí)行之前,都要執(zhí)行的,包括構(gòu)造函數(shù),

當(dāng)然,如果你在要執(zhí)行的方法中又調(diào)用的另一個或者多個方法,在另外調(diào)用那些方法時,_initialize()方法是不會再執(zhí)行了,它關(guān)聯(lián)的是你首次調(diào)用的方法,也就是說,方法里面干什么,它管不著了。

推薦教程:《thinkphp框架》

當(dāng)前題目:理解thinkphp中的__construct()和__initialize()
文章分享:http://muchs.cn/article8/cghoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、網(wǎng)站制作商城網(wǎng)站、網(wǎng)站設(shè)計公司外貿(mào)建站、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)