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. 麦肯锡:潜力巨大,障碍多多,人工智能医疗是蓝海还是虚火?
  2. ASM模型对人脸特征点的检测
  3. 使用 Visual Studio Team Services 和 IIS 创建持续集成管道
  4. 抽象类(c++细节篇九)
  5. 【Spring学习】RestTemplate访问Rest服务总结
  6. 声称只懂动物、女人和写作的作家——胡东林
  7. java 图片生成器_Java实现的图片生成器
  8. Vue.js 2.0版
  9. C#数据库类(zz)
  10. python实现mysql数据导入HBase
  11. ChartControl应用tip
  12. mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame教程步骤详解
  13. Android studio 打包 uni App 修改apk名称,app名称及图标
  14. 四川农业大学计算机考研调剂,四川农业大学调剂基本条件
  15. 瑞星杀毒软件卸载方法
  16. EagleEye的特性分析
  17. 移动应用程序设计基础——安卓动画与视音频播放器的实现
  18. python教孩子学编程,教孩子学编程(Python语言版)
  19. mysql表analyze,ANALYZE TABLE语句如何帮助维护MySQL表?
  20. 嵌入式系统词汇表(收藏)

热门文章

  1. 【图像压缩】基于matlab余弦变换及霍夫曼编码jpeg压缩和解压【含Matlab源码 2086期】
  2. 个人任务5,事后诸葛亮任务
  3. debian中双网卡上内外网的设置方法
  4. 牛客真题编程——day16
  5. win7更新错误代码80072efe的解决方法
  6. 终端设置指南,让Mac/Linux/Windows终端更上一层楼
  7. JedisClusterException: No way to dispatch this command to Redis Cluster because keys have different
  8. 星星之火-7:从数值空间理解模拟信号、离散信号、数字信号的区别
  9. MQTT断线重连及订阅消息恢复
  10. zynq使用lwip远程更新flash