ThinkPHP中类的构造函数_construct()与_initialize()的区别详解


Posted in PHP onMarch 13, 2017

前言

相信熟悉THINKPHP的phper基本上都很熟悉_initialize()这个方法,我们似乎也很少去使用_construct() ,除非自己写插件,否则还真是很少用到。

今天查看代码突然看到_construct()这个php自带的构造方法,我的第一感觉是比较陌生,虽然之前学习java时经常遇到,但是很久不用基本忘记。我平时的习惯是将知识的重点写

在我那本小笔记上,但是很久不写字,曾经高中那个那种飘逸灵动的书写笔法彻底丢到异次元。再加上之前的想法,所以就来学习学习技术大牛们写写博客,这不是为了装逼,而只是让自己工作成果的点点滴滴都能不随时间流逝而消散。下面来看看详细的介绍吧。

先贴上代码(我的环境是wamp,使用了TP框架):

创建的FatherAction.class.php文件

<?php


class FatherAction extends Action{
public function __construct(){
echo 'father';
}
}

?>

创建的SonAction.class.php文件

<?php


class SonAction extends FatherAction{
public function __construct(){
echo 'son';
}
function index(){

}
}

?>

运行子类SonAction里的index()可以看到输出的结果:

son

如果将子类改为:

<?php


class SonAction extends FatherAction{
 public function __construct(){
parent::__construct();
echo 'son';
 }
function index(){

}
}

?>

运行结果为;

fatherson

上面的结果可以得出结论:

在执行子类的构造函数时并不会自动调用父类的构造函数,如果你要调用的话,那么要加上parent::__construct()

当我们把上述的构造方法改为THINKPHP_initialize()方法时运行会发现:结果与前面的一致,若要执行父类的_initialize()方法,也需要使用这一句:parent::_initialize()

那是不是说明php自带的构造函数__construct()与THINKPHP的_initialize()方法一样的呢?

先贴上两段代码:

<?php


class FatherAction extends Action{
public function __construct(){
echo 'father';
}
}

?>
<?php


class SonAction extends FatherAction{
public function _initialize(){
echo 'son';
}


function index(){

}

}

?>

当执行子类SonAction的index方法时发现,输出的结果为:father

即子类调用了父类的构造函数,而没有调用子类的_initialize()方法

再贴上两段代码:

<?php


class FatherAction extends Action{
public function __construct(){
if(method_exists($this,"hello")){
$this->hello();
}
echo 'father';
}
}

?>
<?php


class SonAction extends FatherAction{
public function _initialize(){
echo 'son';
}
function index(){

}

function hello(){
echo 'hello';
}
}

?>

执行子类SonAction的index方法,发现输入的结果为hellofather

由此可以得出结论:

当THINKPHP的父类有构造函数而子类没有时,THINKPHP不会去执行子类的_initialize()

当THINKPHP的父类子类均有构造函数时,要调用父类的构造函数必须使用parent::__construct() ----------------- _initialize()同理;

当THINKPHP的子类同时存在__construct构造函数和_initialize()方法,只会执行子类的__construct构造函数(这个本人亲测,上述代码没有)。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
一个ftp类(ini.php)
Oct 09 PHP
纯PHP生成的一个树叶图片画图例子
Apr 16 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
PHP中防止SQL注入方法详解
Dec 25 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
PHP后台微信支付和支付宝支付开发
Apr 28 PHP
php封装的mongodb操作类代码
Aug 06 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 #PHP
php解析mht文件转换成html的实例
Mar 13 #PHP
使用phpQuery获取数组的实例
Mar 13 #PHP
php获取linux命令结果的实例
Mar 13 #PHP
老生常谈PHP位运算的用途
Mar 12 #PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 #PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 #PHP
You might like
php中用foreach来操作数组的代码
2011/07/17 PHP
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
详解JavaScript正则表达式之RegExp对象
2015/12/13 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
vue之延时刷新实例
2019/11/14 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
Python退火算法在高次方程的应用
2018/07/26 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
一套英文Java笔试题面试题
2016/04/21 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
关于运动会的稿件
2014/02/02 职场文书
公司禁烟通知
2015/04/23 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL