前言

_initialize() 这个方法在官方手册里是这样说的:

如果你的控制器类继承了\think\Controller类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行。

其实不止5,在之前的版本中也出现过,这里和大家聊一聊它的实现过程吧。

示例

下面是官方手册上给的示例:namespace app\index\controller;

use think\Controller;

class Index extends Controller

{

public function _initialize()

{

echo 'init
';

}

public function hello()

{

return 'hello';

}

public function data()

{

return 'data';

}

}

如果访问

http://localhost/index.php/index/Index/hello

会输出init

hello

如果访问

http://localhost/index.php/index/Index/data

会输出init

data

分析

因为使用必须要继承\think\Controller类,加上这个又是初始化,所以我们首先就想到了\think\Controller类中的 __construct(),一起来看代码:/**

* 架构函数

* @param Request $request Request对象

* @access public

*/

public function __construct(Request $request = null)

{

if (is_null($request)) {

$request = Request::instance();

}

$this->view = View::instance(Config::get('template'), Config::get('view_replace_str'));

$this->request = $request;

// 控制器初始化

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

$this->_initialize();

}

// 前置操作方法

if ($this->beforeActionList) {

foreach ($this->beforeActionList as $method => $options) {

is_numeric($method) ?

$this->beforeAction($options) :

$this->beforeAction($method, $options);

}

}

}

细心的你一定注意到了,在整个构造函数中,有一个控制器初始化的注释,而下面代码就是实现这个初始化的关键:// 控制器初始化

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

$this->_initialize();

}

真相出现了有木有?!

其实就是当子类继承父类后,在没有重写构造函数的情况下,也自然继承了父类的构造函数,相应的,进行判断当前类中是否存在 _initialize 方法,有的话就执行,这就是所谓的控制器初始化的原理。

延伸

如果子类继承了父类后,重写了构造方法,注意调用父类的__construct()哦,否则是使用不了的,代码如下:public function __construct()

{

parent::__construct();

...其他代码...

}

总结

一个简单的小设计,这里抛砖引玉的分析下,希望对大家有帮助。

相关标签:PHP

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php initialize(),ThinkPHP5之 _initialize() 初始化方法详解相关推荐

  1. c语言 初始化数组,C 数组的初始化方法详解

    C 数组的初始化方法详解,数据名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?这是因为: (1)数组名作为函数形参时,在函数体内,其失 ...

  2. PyTorch常用参数初始化方法详解

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  3. linux c 数组初始化,C++数组初始化方法详解

    有时在程序中设置变量值比输入变量值更合适.但是,为数组的各个元素编写单独的赋值语句可能意味着大量的输入,对于大型数组而言尤其如此. 例如,来看一个程序: #include #include using ...

  4. C++11中类数据成员初始化方法详解

    C++98为类中提供类成员的初始化列表. 类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员  2.进入构造函数后在构造函数中执行一般计算   1.类里面的任何成员变 ...

  5. php接入qq登陆,thinkphp5中接入QQ登录方法详解

    Thinkphp5中接入QQ登录操作,方法详解: 1.下载PHP SDK <点击进入下载页> 2.下载后的SDK解压,并运行install下的index.php 3.填写appid.app ...

  6. hadoop作业初始化过程详解(源码分析第三篇)

    (一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...

  7. android组件用法说明,Android第三方控件PhotoView使用方法详解

    Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...

  8. 虚拟机2012搭建DNS服务器,Windows Server2012 安装配置DNS服务器方法详解

    Windows Server2012 安装配置DNS服务器方法详解 在云服务器 Windows Server2012 上安装配置DNS服务器方法,安装与配置非常简单,在这里写个完整教程方便大家查询 一 ...

  9. android开发之onCreate( )方法详解

    android开发之onCreate( )方法详解 onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Go ...

最新文章

  1. 【模板/经典题型】FWT
  2. OpenCV中SiftDescriptorExtractor
  3. Docker-操作容器1
  4. FreeCodeCamp学习之数组查找去重
  5. CSS3过渡属性transition详解
  6. Visual Studio 2017将于3月7日发布
  7. “启动Word时提示出错,只能用安全模式才能打开”的解决方法
  8. springboot初始篇(一)
  9. mybatis------通过mapper接口加载映射文件(六)
  10. WPF动态改变主题颜色
  11. 全站仪和手机连接软件_测量员APP全站仪设站的的应用说明
  12. APP渠道:安卓app推广渠道都有这几个!
  13. 图像传感器binning_CMOS图像传感器调试问题汇总
  14. Html5常见面试题总结
  15. Android studio插件GsonFormat 的使用
  16. 35个有创意的信息可视化设计欣赏
  17. 使用Heritrix进行主题抓取
  18. 2022年北京产品经理认证招生简章(NPDP)
  19. 无法定位程序输入点H5Rdereference于动态链接库 libmat.dll上
  20. LoRa学习总结(三)

热门文章

  1. 【Android 进阶】图片加载框架之Glide
  2. Beta版本冲刺第一天
  3. C# TCPIP网络编程
  4. 烽火HG680KA-Hi3798MV300-当贝纯净桌面-卡刷固件包
  5. Linkin大话PC常用快捷键
  6. An Data-Scientist Prepares 《数据科学家的自我修养》
  7. 爬取斗鱼房间名,观众人数
  8. 优秀课件笔记之POWERPOINT 演示文稿
  9. 《平凡的世界》第二部三十二章的小故事
  10. python音频频谱_Python 提取音乐频谱并可视化