php initialize(),ThinkPHP5之 _initialize() 初始化方法详解
前言
_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() 初始化方法详解相关推荐
- c语言 初始化数组,C 数组的初始化方法详解
C 数组的初始化方法详解,数据名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?这是因为: (1)数组名作为函数形参时,在函数体内,其失 ...
- PyTorch常用参数初始化方法详解
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- linux c 数组初始化,C++数组初始化方法详解
有时在程序中设置变量值比输入变量值更合适.但是,为数组的各个元素编写单独的赋值语句可能意味着大量的输入,对于大型数组而言尤其如此. 例如,来看一个程序: #include #include using ...
- C++11中类数据成员初始化方法详解
C++98为类中提供类成员的初始化列表. 类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 2.进入构造函数后在构造函数中执行一般计算 1.类里面的任何成员变 ...
- php接入qq登陆,thinkphp5中接入QQ登录方法详解
Thinkphp5中接入QQ登录操作,方法详解: 1.下载PHP SDK <点击进入下载页> 2.下载后的SDK解压,并运行install下的index.php 3.填写appid.app ...
- hadoop作业初始化过程详解(源码分析第三篇)
(一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...
- android组件用法说明,Android第三方控件PhotoView使用方法详解
Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...
- 虚拟机2012搭建DNS服务器,Windows Server2012 安装配置DNS服务器方法详解
Windows Server2012 安装配置DNS服务器方法详解 在云服务器 Windows Server2012 上安装配置DNS服务器方法,安装与配置非常简单,在这里写个完整教程方便大家查询 一 ...
- android开发之onCreate( )方法详解
android开发之onCreate( )方法详解 onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Go ...
最新文章
- 【模板/经典题型】FWT
- OpenCV中SiftDescriptorExtractor
- Docker-操作容器1
- FreeCodeCamp学习之数组查找去重
- CSS3过渡属性transition详解
- Visual Studio 2017将于3月7日发布
- “启动Word时提示出错,只能用安全模式才能打开”的解决方法
- springboot初始篇(一)
- mybatis------通过mapper接口加载映射文件(六)
- WPF动态改变主题颜色
- 全站仪和手机连接软件_测量员APP全站仪设站的的应用说明
- APP渠道:安卓app推广渠道都有这几个!
- 图像传感器binning_CMOS图像传感器调试问题汇总
- Html5常见面试题总结
- Android studio插件GsonFormat 的使用
- 35个有创意的信息可视化设计欣赏
- 使用Heritrix进行主题抓取
- 2022年北京产品经理认证招生简章(NPDP)
- 无法定位程序输入点H5Rdereference于动态链接库 libmat.dll上
- LoRa学习总结(三)