__construct()和__initialize()
ThinkPHP中的__initialize()和类的构造函数__construct()
网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下。将结果和大家分享。不对请更正。
首先,我要说的是
1、__initialize()不是php类中的函数,php类的构造函数只有__construct().
2、类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化。
3、当子类和父类都有__construct()函数的时候,如果要在初始化子类的时候同时调用父类的__constrcut(),则可以在子类中使用parent::__construct().
如果我们写两个类,如下
- class Action{
- public function __construct()
- {
- echo 'hello Action';
- }
- }
- class IndexAction extends Action{
- public function __construct()
- {
- echo 'hello IndexAction';
- }
- }
- $test = new IndexAction;
- //output --- hello IndexAction
很明显初始化子类IndexAction的时候会调用自己的构造器,所以输出是'hello IndexAction'。
但是将子类修改为
- class IndexAction extends Action{
- public function __initialize()
- {
- echo 'hello IndexAction';
- }
- }
那么输出的是'hello Action'。因为子类IndexAction没有自己的构造器。
如果我想在初始化子类的时候,同时调用父类的构造器呢?
- class IndexAction extends Action{
- public function __construct()
- {
- parent::__construct();
- echo 'hello IndexAction';
- }
- }
这样就可以将两句话同时输出。
当然还有一种办法就是在父类中调用子类的方法。
- class Action{
- public function __construct()
- {
- if(method_exists($this,'hello'))
- {
- $this -> hello();
- }
- echo 'hello Action';
- }
- }
- class IndexAction extends Action{
- public function hello()
- {
- echo 'hello IndexAction';
- }
- }
这样也可以将两句话同时输出。
而,这里子类中的方法hello()就类似于ThinkPHP中__initialize()。
所以,ThinkPHP中的__initialize()的出现只是方便程序员在写子类的时候避免频繁的使用parent::__construct(),同时正确的调用框架内父类的构造器,所以,我们在ThnikPHP中初始化子类的时候要用__initialize(),而不用__construct(),当然你也可以通过修改框架将__initialize()函数修改为你喜欢的函数名。
http://www.thinkphp.cn/code/367.html
转载于:https://www.cnblogs.com/guke/p/3915266.html
__construct()和__initialize()相关推荐
- ThinkPHP之__construct()和__initialize()
ThinkPHP中的__initialize()和类的构造函数__construct() 网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不 ...
- php的封装construct构造方法,__construct() 构造函数
1.构造函数实例化类的时候会自动调用, 2.子类没有构造函数,会直接调用父类的构造涵数, 继承父类的属性和方法 3.子类和父类都有构造函数,实例子类时不会自动调用父类构造函数,只会调用子类自己的构造函 ...
- php _initialize __construct,Thinkphp5 _initialize() 和 _construct() 中无法Return
事情的起因是这样的,我在写接口的时候,也想和后台一样先判断用户是否登录,如果登录才能操作,可是其他控制器继承公共控制器之后没有反映.之后我查阅了半会资料才搞明白是怎么回事. #### __initia ...
- 009-对象—— 构造方法__construct析构方法__destruct使用方法 PHP重写与重载
<?php /**构造方法__construct析构方法__destruct使用方法 PHP重写与重载*/ //构造方法:当实例化对象时,自动运行的方法 /*class channel{func ...
- Php魔术函数学习与应用 __construct() __destruct() __get()等
(1)初识魔术方法 Php5.0发布以来为我们提供了很多面向对象 的特性,尤其是为我们提供了好多易用的魔术方法,这些魔术方法可以让我们简化我们的编码,更好的设计我们的系统.今天我们就来认识下php5. ...
- thinkphp中__construct与_initialize()的区别
(我的环境是wamp,使用了TP框架): 创建的FatherAction.class.php文件 <?php class FatherAction extends Action{ public ...
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __uns
1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 __get( $property ) 当调用一个未定义的属性时访问此方法 __set( $property, $va ...
- php 保护连接字符串,PHP OOP更新扩展类__construct上的受保护字符串
我正在尝试创建我的第一个PHP类,并一直坚持如何更新受保护的字符串. 我要做的是创建一个扩展类,使用主类中受保护的字符串. 我可以在第一个类加载时更新字符串,但是当我加载扩展类时,它不会显示更新的文本 ...
- laravel5.5 __construct函数 无法使用session() 解决方法和实例
laravel5.5 __construct函数 无法使用session() 解决方法和实例 参考文章: (1)laravel5.5 __construct函数 无法使用session() 解决方法和 ...
最新文章
- Intel主动管理技术用例-远程诊断、远程修复
- 咨询的真相8:咨询业的“前世今生”
- 用原生PHP做Blog系统-Day01
- r语言ggplot2一夜多图_ggplot2绘图:多张图合并为一张
- ACL20 Best Paper揭晓!NLP模型评价体系或将迎来重大转折
- 计算与推断思维 十二、为什么均值重要
- linux怎么添加ubuntu源,细说 Ubuntu Linux 软件源
- Delphi 7生成XML
- 实人认证玩出新高度,给千年老城注入新生科技力量
- 一张图教你清理IE浏览器缓存
- 几种segue的使用场景
- Arcgis10.8中将三维的高程点转换为二维的高程点
- 如何实现广告图片总是显示在页面上方,并且随滚动条同步移动?
- 三重积分平均值_有关研究生考试中高等数学 分级中 “数农”是什么意思?
- hbase2.1.6 mr
- 全新数据增强 | TransMix 超越Mix-up、Cut-mix方法让模型更加鲁棒、精度更高
- 阿里云服务器10M带宽实际速度能达到多少?
- SourceInsight4.0自定义编译命令
- 新零售一般使用什么进行线上线下互通
- 计算机启动时间过长,电脑开机时间太长怎么优化
热门文章
- php系统函数区分大小写,php函数名区分大小写吗?
- java serializable 源码_Java源码分析之-Serializable接口
- android开发 文件分享到应用,Android 实现文件分享功能(共享多个文件)
- C语言结构体字节对齐
- C atoi函数
- C 的16个大坑,你能躲过几个?
- 微软project服务器搭建,Project Professional 版本(Project Server 2010 设置)
- 拆分js文件_2021入门Webpack,看这篇就够了:Webpack.config.js 解析
- C++ vector求均值和方差
- 【渝粤教育】广东开放大学 房屋建筑学 形成性考核 (50)