理解thinkphp中的__construct()和__initialize()
发布时间 - 2020-07-23 00:00:00 点击率:次关于thinkphp中的__construct()和_initialize()的理解
网上有很多的说法和用法,自己测试了一下,下面是根据测试结果并结合自己的理解得出的结论,如有不对的地方,欢迎大家纠正!!!
我们先看一下Thinkphp自带的Controlle类的内容(ThinkPHP\Library\Think\Controller.class.php)
看一下构造函数:
/**
* 架构函数 取得模板对象实例
* @access public
*/
public function __construct() {
Hook::listen('action_begin',$this->config);
//实例化视图类
$this->view = Think::instance('Think\View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this->_initialize();
}从Controller类中的构造函数中可以知道,该构造函数会判断对象中是否有_initialize方法,如果有,就执行先_initialize方法,
因此,如果我们在自己定义的控制器中,
1):有重写构造函数:
①在重写的构造中有实现父类的构造函数(parent::construct() ),
如果该控制器中有定义_initialize()方法,那么,我们在调用该控制器中的方法时,会先执行_initialize()方法,然后再执行我们需要的方法,看代码:
';
}
public function _initialize() {
echo '我先来
';
// parent::_initialize();
}
public function index(){
self::b();
echo '这是index';
}
public function b() {
echo 'bbbb
';
}
}
/*
当执行index方法时,打印结果:
我先来
bbbb
我是构造
bbbb
这是index
*/②:在重写的构造中没有实现父类的构造函数,执行方法时,定义的_initialize()方法则没有作用(不会在执行方法时,先执行_initialize方法),看代码:
';
}
public function _initialize() {
echo '我先来
';
// parent::_initialize();
}
public function index(){
self::b();
echo '这是index';
}
public function b() {
echo 'bbbb
';
}
}
/*
当执行index方法时,打印结果:
bbbb
我是构造
bbbb
这是index
*/注:这里面的所说的先执行_initialize()方法,是在parent::__construct();前没有任何函数调用,如果你非得在parent::__construct();前来个self::b(),那没得说,肯定是先执行b(),不过一般不这样写,在实现父类的构造函数前一般没有任何输出和配置
再有,如果是继承,如果父类有构造函数,子类在其构造函数一般先把父类的构造函数先初始化,确保代码的原始性和完整性
2)没有重写构造函数,也就是说在我们定义的控制器中没有声明构造函数
这种情况,如果在控制器中有定义_initialize()方法,则当我们调用其他方法时,会先调用_initialize()方法,看代码:
';
// }
public function _initialize() {
echo '我先来
';
// parent::_initialize();
}
public function index(){
self::b();
echo '这是index';
}
public function b() {
echo 'bbbb
';
}
}
/*
当执行index方法时,打印结果:
我先来
bbbb
这是index
*/另外,_initialize()还可以用来继承
';
}
public function _initialize() {
echo '我先来
';
}
public function a() {
echo 'aaaa
';
}
}';
}
public function _initialize() {
parent::_initialize();
echo '我是子类先来
';
}
public function index(){
self::b();
echo '这是index';
}
public function b() {
echo 'bbbb
';
}
}
/*
当执行index方法时,打印结果:
我先来
我是子类先来
我是父类
bbbb
我是构造
bbbb
这是index
*/注意:如果父类的构造函数中没有parent::construct(),定义的_initialize()也不起作用
那么,同时存在__construct()(该构造函数初始化了父类的构造函数)和_initialize() ,到底先执行哪个呢?
答案是——先执行_initialize()方法,也就是说,在满足条件下,_initial
ize()函数是在任何方法执行之前,都要执行的,包括构造函数,
当然,如果你在要执行的方法中又调用的另一个或者多个方法,在另外调用那些方法时,_initialize()方法是不会再执行了,它关联的是你首次调用的方法,也就是说,方法里面干什么,它管不着了。
推荐教程:《thinkphp框架》
# thinkphp
# php
# 父类
# 子类
# 构造函数
# 继承
# class
# 对象
# 我是
# 这是
# 先来
# 重写
# 中有
# 是在
# 没有任何
# 也就是说
# 器中
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
JS实现鼠标移上去显示图片或微信二维码
Laravel如何使用查询构建器?(Query Builder高级用法)
打造顶配客厅影院,这份100寸电视推荐名单请查收
如何为不同团队 ID 动态生成多个非值班状态按钮
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
Laravel storage目录权限问题_Laravel文件写入权限设置
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
黑客如何利用漏洞与弱口令入侵网站服务器?
韩国服务器如何优化跨境访问实现高效连接?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
简单实现Android验证码
EditPlus中的正则表达式实战(5)
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
MySQL查询结果复制到新表的方法(更新、插入)
如何构建满足综合性能需求的优质建站方案?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
如何快速搭建二级域名独立网站?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
如何在阿里云高效完成企业建站全流程?
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
中山网站推广排名,中山信息港登录入口?
,怎么在广州志愿者网站注册?
iOS UIView常见属性方法小结
如何在云指建站中生成FTP站点?
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel怎么实现验证码(Captcha)功能
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
制作企业网站建设方案,怎样建设一个公司网站?
使用C语言编写圣诞表白程序
Laravel如何配置和使用缓存?(Redis代码示例)
如何在腾讯云服务器快速搭建个人网站?
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
如何快速重置建站主机并恢复默认配置?
php结合redis实现高并发下的抢购、秒杀功能的实例
WEB开发之注册页面验证码倒计时代码的实现
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
JavaScript如何操作视频_媒体API怎么控制播放
Android okhttputils现在进度显示实例代码
如何在阿里云购买域名并搭建网站?
C++时间戳转换成日期时间的步骤和示例代码
Laravel如何发送系统通知?(Notification渠道示例)
公司门户网站制作流程,华为官网怎么做?

