视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
理解thinkphp中的__construct()和__initialize()
2020-11-02 18:45:04 责编:小采
文档

关于thinkphp中的__construct()和_initialize()的理解

网上有很多的说法和用法,自己测试了一下,下面是根据测试结果并结合自己的理解得出的结论,如有不对的地方,欢迎大家纠正!!!

我们先看一下Thinkphp自带的Controlle类的内容(ThinkPHPLibraryThinkController.class.php)

看一下构造函数:

/**

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

 * @access public

 */

 public function __construct() {

 Hook::listen('action_begin',$this->config);

 //实例化视图类

 $this->view = Think::instance('ThinkView');

 //控制器初始化

 if(method_exists($this,'_initialize'))

 $this->_initialize();

 }

从Controller类中的构造函数中可以知道,该构造函数会判断对象中是否有_initialize方法,如果有,就执行先_initialize方法,

因此,如果我们在自己定义的控制器中,

1):有重写构造函数:

①在重写的构造中有实现父类的构造函数(parent::construct() ),

如果该控制器中有定义_initialize()方法,那么,我们在调用该控制器中的方法时,会先执行_initialize()方法,然后再执行我们需要的方法,看代码:

<?php

namespace HomeController;

use ThinkController;

class IndexController extends Controller {

 

 public function __construct() {

 parent::__construct();

 self::b();

 echo '我是构造<br />';

 }

 public function _initialize() {

 echo '我先来<br />';

 // parent::_initialize();

 }

 public function index(){

 self::b();

 echo '这是index';

 }

 

 public function b() {

 echo 'bbbb<br />';

 }

}

 

/*

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

我先来

bbbb

我是构造

bbbb

这是index

*/

②:在重写的构造中没有实现父类的构造函数,执行方法时,定义的_initialize()方法则没有作用(不会在执行方法时,先执行_initialize方法),看代码:

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

注:这里面的所说的先执行_initialize()方法,是在parent::__construct();前没有任何函数调用,如果你非得在parent::__construct();前来个self::b(),那没得说,肯定是先执行b(),不过一般不这样写,在实现父类的构造函数前一般没有任何输出和配置

再有,如果是继承,如果父类有构造函数,子类在其构造函数一般先把父类的构造函数先初始化,确保代码的原始性和完整性

2)没有重写构造函数,也就是说在我们定义的控制器中没有声明构造函数

这种情况,如果在控制器中有定义_initialize()方法,则当我们调用其他方法时,会先调用_initialize()方法,看代码:

<?php

namespace HomeController;

use ThinkController;

class IndexController extends Controller {

 

 // public function __construct() {

 // // parent::__construct();

 // self::b();

 // echo '我是构造<br />';

 // }

 public function _initialize() {

 echo '我先来<br />';

 // parent::_initialize();

 }

 public function index(){

 self::b();

 echo '这是index';

 }

 

 public function b() {

 echo 'bbbb<br />';

 }

}

 

/*

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

我先来

bbbb

这是index
*/

另外,_initialize()还可以用来继承

<?php

namespace HomeController;

use ThinkController;

class BaseController extends Controller {

 public function __construct() {

 parent::__construct();

 

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

 }

 

 public function _initialize() {

 echo '我先来<br />';

 }

 

 public function a() {

 echo 'aaaa<br />';

 }

}
<?php

namespace HomeController;

use ThinkController;

class IndexController extends BaseController {

 

 public function __construct() {

 parent::__construct();

 self::b();

 echo '我是构造<br />';

 }

 public function _initialize() {

 parent::_initialize();

 echo '我是子类先来<br />';

 }

 public function index(){

 self::b();

 echo '这是index';

 }

 

 public function b() {

 echo 'bbbb<br />';

 }

}

 

/*

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

我先来

我是子类先来

我是父类

bbbb

我是构造

bbbb

这是index
*/

注意:如果父类的构造函数中没有parent::construct(),定义的_initialize()也不起作用

那么,同时存在__construct()(该构造函数初始化了父类的构造函数)和_initialize() ,到底先执行哪个呢?

答案是——先执行_initialize()方法,也就是说,在满足条件下,_initialize()函数是在任何方法执行之前,都要执行的,包括构造函数,

当然,如果你在要执行的方法中又调用的另一个或者多个方法,在另外调用那些方法时,_initialize()方法是不会再执行了,它关联的是你首次调用的方法,也就是说,方法里面干什么,它管不着了。

推荐教程:《thinkphp框架》

下载本文
显示全文
专题