__construct 与 ThinkPhp _initialize 的区别
一开始,不怎么了解这个东西,所以最近想到了就来研究一下这个东西。
首先,我就先说说php中的继承,__construct是类中的构造函数,用于实例化
1 <?php 2 class Action{ 3 public function __construct(){ 4 echo 'Action'; 5 } 6 } 7 8 class SonAction extends Action{ 9 public function __construct(){ 10 echo 'Son Action'; 11 } 12 } 13 14 $son = new SonAction(); 15 16 //result:Son Action 17 ?>
在父类中定义构造函数,子类中使用构造函数,示例化子类,输出Son Action,没有调用父类中的构造函数
<?php class Action{ public function __construct(){ echo 'Action'; } } class SonAction extends Action{ public function __construct(){ parent::__construct(); echo 'Son Action'; } } $son = new SonAction(); //result:ActionSon Action ?>
在子类中,使用parent::__construct(),调用父类的构造函数,因为继承了父类,定义自己的构造方法,重载了__construct(),所以需要调用父类的构造函数,需要parent::__construct
<?php class Action{ public function __construct(){ echo 'Action'; } } class SonAction extends Action{ } $son = new SonAction(); //result:Action ?>
在继承的子类中没有自己的构造函数,可以说是继承了父类的构造函数(个人理解,可以探讨一下),所以实例化的时候,输出得到result
//接下来我说说_initialize 这个函数
其实这个函数不是原生php含有的,而是一个TP自己定义的一个函数
我们可以再TP的框架上看到,我的版本是3.1.3
/** * 架构函数 取得模板对象实例 * @access public */ public function __construct() { tag('action_begin',$this->config); //实例化视图类 $this->view = Think::instance('View'); //控制器初始化 if(method_exists($this,'_initialize')) $this->_initialize(); }
这个函数是Action中的构造函数,在控制器初始化中,使用了method_exists,判断当前实例化的类中是否函数_initialize这个函数,
当子类没有构造函数的时候,子类继承父类的构造函数(子类会继承[或调用最近父类的构造函数]),判断子类中是否含有_initialize这个函数,
若含有,调用函数,在构造的时候调用该函数,在construct之后。。。。。
下面这个例子:可以仔细观察出来
Action类的构造器 public function __construct() { echo 'grand father'; tag('action_begin',$this->config); //实例化视图类 $this->view = Think::instance('View'); //控制器初始化 if(method_exists($this,'_initialize')) $this->_initialize(); } TestAction类的构造器 class TestAction extends Action{ public function __construct(){ echo 'Test override Action'; } } SonatestAction类初始化函数 class SontestAction extends TestAction{ public function _initialize(){ echo 'Son test'; } public function index(){ echo 222; die(); } } //输出得到Test override Action222
上面的例子得到结果分析可得到: TestAction重载了Action中的构造器,所以访问SontestAction中的index的时候,首先会调用构造函数,则会调用父类的构造器,父类构造器中不含有调用_initialize所以。。。子类中没有调用_initialize
哪里有错误可以留言讨论。
转载请注明转载地址,原创有毒,转载送菊花:http://i.cnblogs.com/EditPosts.aspx?postid=4204198&update=1