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 相关文章推荐
php 自写函数代码 获取关键字 去超链接
Feb 08 PHP
PHP输入流php://input介绍
Sep 18 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
ThinkPHP之R方法实例详解
Jun 20 PHP
php 参数过滤、数据过滤详解
Oct 26 PHP
php修改数组键名的方法示例
Apr 15 PHP
Yii2选项卡的简单使用
May 26 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
PHP getNamespaces()函数讲解
Feb 03 PHP
Laravel配合jwt使用的方法实例
Oct 25 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与已存在的Java应用程序集成
2006/10/09 PHP
php cookis创建实现代码
2009/03/16 PHP
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
Python实现文件按照日期命名的方法
2015/07/09 Python
python中异常报错处理方法汇总
2016/11/20 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
Django实现跨域的2种方法
2019/07/31 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
allbeauty美国:英国在线美容店
2019/03/11 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
Java编程面试题
2016/04/04 面试题
年终考核评语
2014/01/19 职场文书
公司授权委托书范文
2014/08/02 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers