1、PHP中只有__construct方法为构造方法,会自动执行,_initialize方法本身不是构造方法,不会自动执行,只是在thinkphp的Controller.class.php中我们可以看到如下代码

public function __construct() {

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

//实例化视图类

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

//控制器初始化

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

$this->_initialize();

}

核心就在于method_exists这一段,典型的父类调用子类的一个方法。因此我们在有控制器继承Controller.class.php的时候,例如BaseController.class.php定义了_initialize方法,则会在初始化BaseController这个类的时候自动去调用_initialize方法。

2、我们经常会看到很多代码继承关系比较复杂,例如

a、ProjectController.class.php

class ProjectController extends UcenterBaseController{

protected function _initialize(){

$this->model = new ProjectModel();

parent::_initialize();

}

b、UcenterBaseController.class.php

class UcenterBaseController extends FrontendBaseController{

protected function _initialize(){

decide_terminal();

$this->tablePrefix = C('DB_PREFIX');

parent::_initialize();

c、FrontendBaseController.class.php

class FrontendBaseController extends BaseController

{

/**

* 初始化入口

*/

protected function _initialize()

{

parent::_initialize();

if(APP_NAME == 'study') {

set_theme(C('STUDY_THEME'));

} else {

set_theme(C('SITE_INFO.templet'));

}

}

d、BaseController.class.php

class BaseController extends Controller {

/**

* 初始化入口

*/

protected function _initialize() {

decide_terminal();

decide_site();

可能大家在碰到这种继承关系的时候比较晕,多重继承究竟执行的是哪个_initialize方法,这个大家都需要注意php的第二个特性,如果父子类均有_initialize()函数,则子类覆盖了父类的,如果子类没有而父类有,则子类继承父类的。在调用子类对象的_initialize()时,不会导致自动调用父类的_initialize(),我们必须显示的用parent::_initialize()来调用父类的方法。也就是说程序在初始化Project.class.php方法的时候,发现这个类有了_initialize方法,则不会自动去执行父类UcenterBaseController的,直接执行自己定义的的_initialize,然后_initialize中有parent::_initialize()再去执行UcenterBaseController的_initialize方法,这个里面再调用parent::_initialize执行。需要注意的一点是:在BaseController.class.php中不要写parent::_initialize,会直接报错的,因为Controller.class.php中没有_initialize方法

3、总结

(1)_initialize()函数是在任何方法执行之前,都要执行的,当然也包括_ _construct构造函数,注意,_ _construct这里是双划线,而_initialize()函数是单划线。

(2)如果父子类均有_initialize()函数,则子类覆盖了父类的,如果子类没有而父类有,则子类继承父类的。在调用子类对象的_initialize()时,不会导致自动调用父类的_initialize()。

(3)默认情况下,子类的构造函数也不会自动调用父类的构造函数,这一点与Java不同。实际编写子类的构造函数时,一般都要加上父类构造函数的主动调用 parent::_ _construct(),否则会导致子类对象空指针的异常,如Call to a member function assign() on a non-object。

(4)_initialize()函数是在“任何”方法调用之前都要调用的,也就是说如果存在_initialize()函数,调用对象的任何方法都会导 致_initialize()函数的自动调用,而_ _construct构造函数仅仅在创建对象的时候调用一次,跟其它方法调用没有关系。

initialize php,THINKPHP的_initialize方法相关推荐

  1. tp5.1升级指导---控制器调整 _initialize方法更改为initialize

    控制器调整 为了规范化,继承了think\Controller类的话,初始化方法从原来的_initialize方法更改为initialize. 转载于:https://www.cnblogs.com/ ...

  2. ThinkPHP的field方法的用法总结

    ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段,下面详细道来.1.用于查询 在查询操作中field方法是使用最频繁的. $Model- ...

  3. 仿写thinkphp的I方法

    自己定义一个方法仿写thinkphp的I 方法 <?php function I($key="",$default='',$function="") {$ ...

  4. think php a方法,PHP_ThinkPHP之A方法实例讲解,ThinkPHP的A方法用于在内部实例 - phpStudy...

    ThinkPHP之A方法实例讲解 ThinkPHP的A方法用于在内部实例化控制器,其调用格式为: A('[项目://][分组/]模块','控制器层名称') 最简单的用法: $User = A('Use ...

  5. think php a方法,ThinkPHP之A方法实例讲解_PHP

    ThinkPHP ThinkPHP的A方法用于在内部实例化控制器,其调用格式为: A('[项目://][分组/]模块','控制器层名称') 最简单的用法: $User = A('User'); 表示实 ...

  6. php tp框架调用方法,thinkPHP框架使用方法

    title: thinkPHP框架使用方法 date: 2018-01-05 20:30:44 tags: 1. thinkPHP思想 thinkPHP基于MVC思想,MVC是一种设计模式,他强制的使 ...

  7. php调用另一个php文件里的变量的值,thinkphp中一个方法调用另一个步骤的变量

    thinkphp中一个方法调用另一个方法的变量 //实例化上传类 public function upload() { $upload = new Upload(); $upload->maxS ...

  8. php中sisson用法,thinkPHP中session()方法用法详解

    本文实例讲述了thinkPHP中session()方法用法.分享给大家供大家参考,具体如下: 系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成. 用法 s ...

  9. php create()方法,ThinkPHP中create()方法自动验证实例

    ThinkPHP中create()方法自动验证实例2020-06-16 04:24:32 自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验 ...

  10. php l方法,ThinkPHP的L方法使用简介

    thinkPHP的L方法用于启用多语言的情况下,设置和获取当前的语言定义. 其调用格式为:L('语言变量'[,'语言值']) 1.设置语言变量 除了使用语言包定义语言变量之外,我们可以用L方法动态设置 ...

最新文章

  1. 功率增长步长(powerRampingStep)
  2. aws 部署python lambda_python - 如何使用Aws Lambda(python)接收文件 - 堆栈内存溢出
  3. 用Delphi创建服务程序
  4. 进入环境_如何进入Windows恢复环境(WinRE)
  5. Java多线程 - 线程组
  6. MAP文件和调试(VC)(从崩溃地址找出错源码位置)
  7. 垂死病中惊坐起_我如何开始恢复垂死的软件团队的过程
  8. java swt 布局_Java开发网 - 基于SWT的类XUL实现: SWT-XUI
  9. windows下IDEA全面红色,但是能编译,不能智能提示
  10. Python指南--错误和异常
  11. 被Json格式化后那可怜的时间
  12. 17. 促销,市场营销和内容页
  13. Microsoft Excel设置单元格下拉框的方法
  14. 艾美捷PEG-2000 DMG解决方案
  15. 计算机二级vfp考试大纲,全国计算机等级考试二级VFP考试大纲.doc
  16. 运放的增益带宽积、单位增益带宽
  17. 基于Maya 2018安装OpenVDB插件
  18. 融360第三季度营收4.44亿 营销费用占比大幅降低
  19. ​WPF CompositionTarget.Rendering和 DispatcherTimer​
  20. 前端知识合集【重中之重】,我只看这一篇!

热门文章

  1. 音视频编解码之路:JPEG编码
  2. Excel表格转换为Word表格,并且保留Excel表格中公式不发生变化
  3. ElasticSearch: 使用Java Api 操作 ES
  4. 台式计算机未识别网络,台式机显示未识别网络怎么办
  5. HTML将广告关闭的JS代码,JS实现可点击展开与关闭的左侧广告代码,js代码
  6. 2.4g低功耗SI24R1校园答题器
  7. 1964年第一代电子计算机,电子计算机的发展
  8. Rant ?? 我爱每一片绿叶
  9. 我爱过你吗--我看美丽心灵的永恒阳光
  10. 什么是搜索引擎?搜索引擎有哪些?