首页 > 代码库 > __construct 与 ThinkPhp _initialize 的区别

__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 Action17 ?>

在父类中定义构造函数,子类中使用构造函数,示例化子类,输出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

__construct 与 ThinkPhp _initialize 的区别