__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

时间: 2024-11-09 08:16:30

__construct 与 ThinkPhp _initialize 的区别的相关文章

ThinkPHP实现登录限制时__construct和_initialize的区别

ThinkPHP支持两种构造方法:  __construct和_initialize(ThinkPHP内置的构造方法). 测试URL为:  http://oa.com/index.php/Admin/User/add 修改用户控制器类文件UserController.class.php 如下: 1.__construct构造方法 修改中间控制器类CommonController.class.php 如下: 说明:empty() 5.5 版本之后支持表达式,否则会报如下错误: 运行结果如下: 中间

ThinkPHP中initialize和construct的不同

本文转载自:http://www.kuitao8.com/20140819/2953.shtml ThinkPHP中initialize()和construct()这两个函数都可以理解为构造函数,前面一个是tp框架独有的,后面的是php构造函数,那么这两个有什么不同呢? 在网上搜索,很多答案是两者是一样的,ThinkPHP中initialize相当于php的construct,这么说是错误的,如果这样,tp为什么不用construct,而要自己弄一个ThinkPHP版的initialize构造函

ThinkPHP中_initialize()与__construct()用法

1 _initialize()不是php类中的构造函数,php类的构造函数只有__construct(). 2 类的初始化:子类如果有自己的构造函数__construct(),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化 3 当子类和父类都有__construct()函数的时候,如果要在初始化子类的时候同时调用父类的__constrcut(),则可以在子类中使用parent::__construct(). 如果我们写两个类,如下  代码如下 复制代码 class Act

【TP3.2】详解_initialize() 和 __construct() 的区别和联系

1.假设 一个AdminController.class.php 集成至 \Think\Controller 类, 我们来看看Controller.class.php的构造方法源码: /** * 架构函数 取得模板对象实例 * @access public */ public function __construct() { Hook::listen('action_begin',$this->config); //实例化视图类 $this->view = Think::instance('T

_initialize() 区别 __construct()

_initialize()方法是在任何方法执行之前,都要执行的,当然也包括 __construct构造函数. 也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initialize()函数的自动调用,而__construct()构造函数仅仅在创建对象的时候调用一次,跟其它方法调用没有关系. __construct这里是双划线,而_initialize()函数是单划线 如果父子类均有_initialize()函数,则子类覆盖了父类的,如果子类没有而父类有,则子类继承父类的

thinkPHP中_initialize方法实例分析

子类的_initialize方法自动调用父类的_initialize方法. 而php的构造函数construct,如果要调用父类的方法,必须在子类构造函数显示调用parent::__construct(); parent::_initialize() 是调用父类的_initialize方法,如果你的父类_initialize函数没有任何内容,不需要写parent::_initialize() <?php class BaseAction extends Action { // 继承Thinkph

ThinkPHP中的__initialize()和类的构造函数__construct()

ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对请更正.首先,我要说的是1.__initialize()不是php类中的函数,php类的构造函数只有__construct().2.类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化.3.当子类和父类都有__co

[转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法.通俗一点说:M实例化参数是数据库的表名.D实例化的是你自己在Model文件夹下面建立的模型文件 例如:$user = new UserModel(); 等价于$user = D('user'); 如果实例化的是一个空模型 例如 $Demo = new Model(); 那么它等价于

ThinkPHP中实例化对象M()和D()的区别,select和find的区别

原文:ThinkPHP中实例化对象M()和D()的区别,select和find的区别 1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法.通俗一点说:M实例化参数是数据库的表名.D实例化的是你自己在Model文件夹下面建立的模型文件 例如:$user = new UserModel(); 等价于$user = D('user'); 如