摘要:函数的出现是为了我们可以在子类中同时调用父类与子类的构造函数。而在父类经过特别处理后,本身就就可以完成这个功能了,其实我认为的函数本意就是用来在需要同时调用父类与子类构造函数时用的。
最近在学习ThinkPHP框架,看到_initialize()函数,也正好做个小总结
简单看了谷歌,百度上的教程,感觉噼里啪啦说了好多,全在进行测试,都没说到点子上~
实验版本:ThinkPHP 3.2.3,PHP5.6。
_initialize()函数的出现是为了我们可以在子类中同时调用父类与子类的构造函数。
想要搞明白最简单方法的就是打开TP的源码,最靠谱。
路径:ThinkPHP3.2.3/ThinkPHP/Library/Think/Controller.class.php.(△Controller是一个抽象类△)
我们可以看到:
在此处Controller这个抽象类重写了__construct()方法,重点看看三条红线,这里就是_initialize()的全部,其实压根没有特别声明一个_initialize()方法然后赋予它特别的功能。
可以看出,_initialize()具备构造函数的功能纯粹是因为它正好在__construct()里而已(当实例化类时,构造函数__construct运行,如果当前类存在_initialize()方法,顺带执行了_initialize())
我们看下在原生PHP中如何完成同时调用子类父类构造函数需求的。
那么在ThinkPHP中呢?(不要在意格式)
原生代码想要完成需求需要在子类中调用运行parent::__construct()。
而ThinkPHP在父类经过特别处理后,_initialize()本身就就可以完成这个功能了,其实我认为ThinkPHP的_initialize函数本意就是用来在需要同时调用父类与子类构造函数时用的。
总结一下在TP中_initialize()和__construct()使用的注意事项
如果_initialize()和__construct()同时出现的话,那么_initialize()将会无效,因为此时__construct()已经重写,不再调用_initialize()。
如果想要父子类构造函数同时调用,一定要在父类的__construct()中进行处理:
if(method_exists($this,’_initialize’)){ $this -> _initialize(); }
两者都不能被子类覆盖重写,否则父子类同时调用的功能将会失效
就目前而言(ThinkPHP3.2.3)中,_initialize()是有漏洞的,毕竟还需要我们在手动进行一次处理,这样的话_initialize()的作用就剩下命名约束了,因为只要愿意的话完全可以将_initialize改成其他命名,相信官方在后期版本会改进这个函数。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/21503.html
摘要:延伸如果子类继承了父类后,重写了构造方法,注意调用父类的哦,否则是使用不了的,代码如下其他代码总结一个简单的小设计,这里抛砖引玉的分析下,希望对大家有帮助。 前言 _initialize() 这个方法在官方手册里是这样说的: 如果你的控制器类继承了 hinkController类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行。 其实不止5,在之前...
摘要:以上是服务启动过程中的主体设计,其中包括了各种组件的实例化,如对象池等。 EasySwoole 服务启动过程以及主体设计流程源码解析 本文主要讲解EasySwoole 服务的启动过程,会通过源码片段讲解主体的设计流程 命令启动 当我们通过php easyswoole start启动EasySwoole 服务时,命令真正到达的文件是 easyswoole项目vendoreasyswool...
摘要:源码分析错误及异常处理机制错误及异常处理机制文件是,在框架引导文件的的基础文件中注册不知道的可以去看源码分析二入口篇,通过进行的注册。异常中止处理将错误信息托管至写入日志通过获取最后抛出的错误,把信息托管至,在通过异常处理函数进行记录信息。 源码分析 错误及异常处理机制 错误及异常处理机制文件是/thinkphp/library/think/Error.php,在框架引导文件的的基础文...
摘要:使用微信企业号回调的坑最近在做企业号回调的接口,之前做过几个企业号的应用了,每次接入到都报各种各样的错误,算哥倒霉,该踩的不该踩的坑全踩了。 ThinkPHP 使用微信企业号回调的坑 最近在做企业号回调的接口,之前做过几个企业号的应用了,每次接入到Thinkphp都报各种各样的错误,算哥倒霉,该踩的不该踩的坑全踩了。 这次掉坑里差点就放弃了,开发过企业号的都知道,企业号回调会经过一个...
摘要:方法是在任何方法执行之前,都要执行的,当然也包括构造函数。也就是说如果存在函数,调用对象的任何方法都会导致函数的自动调用而构造函数仅仅在创建对象的时候调用一次,跟其它方法调用没有关系。默认情况下,子类的构造函数不会自动调用父类的构造函数。 _initialize()方法是在任何方法执行之前,都要执行的,当然也包括 __construct构造函数。 也就是说如果存在_initializ...
阅读 2369·2021-11-19 09:59
阅读 1885·2019-08-30 15:55
阅读 877·2019-08-29 13:30
阅读 1287·2019-08-26 10:18
阅读 3053·2019-08-23 18:36
阅读 2351·2019-08-23 18:25
阅读 1128·2019-08-23 18:07
阅读 395·2019-08-23 17:15