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 相关文章推荐
NOT NULL 和NULL
Jan 15 PHP
php中的登陆login
Jan 18 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
Oct 27 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
php实现读取和写入tab分割的文件
Jun 01 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
CI框架的安全性分析
May 18 PHP
php连接mysql数据库
Mar 21 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 PHP
PHP强制转化的形式整理
May 22 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 和 MySQL 基础教程(三)
2006/10/09 PHP
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
php生成RSS订阅的方法
2015/02/13 PHP
php实现删除空目录的方法
2015/03/16 PHP
PHP时间和日期函数详解
2015/05/08 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
Js获取事件对象代码
2010/08/05 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
小程序实现选择题选择效果
2018/11/04 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
JavaScript中数组去重的5种方法
2020/07/04 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
全面了解python字符串和字典
2016/07/07 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
初三家长会邀请函
2014/01/18 职场文书
集体婚礼策划方案
2014/02/22 职场文书
节水倡议书范文
2014/04/15 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript