zoukankan      html  css  js  c++  java
  • __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

  • 相关阅读:
    选择器的用处
    全栈工程师基础知识与笔记
    9.13日笔记
    9.12笔记
    9.11Css
    学习笔记
    9.10HTLM
    redis和memcached的区别(总结)
    OO第四次博客作业
    OO第三次博客作业
  • 原文地址:https://www.cnblogs.com/zafuacm/p/4204198.html
Copyright © 2011-2022 走看看