博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThinkPHP之__construct()和__initialize()的区别
阅读量:6935 次
发布时间:2019-06-27

本文共 1479 字,大约阅读时间需要 4 分钟。

hot3.png

ThinkPHP中的__initialize()和类的构造函数__construct()

网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下。将结果和大家分享。不对请更正。
首先,我要说的是
1、__initialize()不是php类中的函数,php类的构造函数只有__construct().
2、类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化。
3、当子类和父类都有__construct()函数的时候,如果要在初始化子类的时候同时调用父类的__constrcut(),则可以在子类中使用parent::__construct().

如果我们写两个类,如下:

 

 

  1. class Action{  
  2.     public function __construct()  
  3.     {  
  4.         echo 'hello Action';  
  5.     }  
  6. }  
  7. class IndexAction extends Action{  
  8.     public function __construct()  
  9.     {  
  10.         echo 'hello IndexAction';  
  11.     }  
  12. }  
  13. $test = new IndexAction;  
  14. //output --- hello IndexAction  

很明显初始化子类IndexAction的时候会调用自己的构造器,所以输出是'hello IndexAction'。
但是将子类修改为

 

  1. class IndexAction extends Action{  
  2.     public function __initialize()  
  3.     {  
  4.         echo 'hello IndexAction';  
  5.     }  
  6. }  

那么输出的是'hello Action'。因为子类IndexAction没有自己的构造器。
如果我想在初始化子类的时候,同时调用父类的构造器呢?

 

  1. class IndexAction extends Action{  
  2.     public function __construct()  
  3.     {  
  4.         parent::__construct();  
  5.         echo 'hello IndexAction';  
  6.     }  
  7. }  

这样就可以将两句话同时输出。
当然还有一种办法就是在父类中调用子类的方法。

 

  1. class Action{  
  2.     public function __construct()  
  3.     {  
  4.         if(method_exists($this,'hello'))  
  5.         {  
  6.             $this -> hello();  
  7.         }  
  8.         echo 'hello Action';  
  9.     }  
  10. }  
  11. class IndexAction extends Action{  
  12.     public function hello()  
  13.     {  
  14.         echo 'hello IndexAction';  
  15.     }  
  16. }  

这样也可以将两句话同时输出。
而,这里子类中的方法hello()就类似于ThinkPHP中__initialize()。
所以,ThinkPHP中的__initialize()的出现只是方便程序员在写子类的时候避免频繁的使用parent::__construct(),同时正确的调用框架内父类的构造器,所以,我们在ThnikPHP中初始化子类的时候要用__initialize(),而不用__construct(),当然你也可以通过修改框架将__initialize()函数修改为你喜欢的函数名。 

转载于:https://my.oschina.net/angelangel/blog/908945

你可能感兴趣的文章
Linux系统日志介绍分析
查看>>
Linux下Tomcat的启动、关闭、杀死进程
查看>>
FTP服务器的防火墙通用设置规则
查看>>
简单记事本及目录树形图的Java实现
查看>>
android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画...
查看>>
Application Virtualization 4.5 部署之(一)
查看>>
获取ip地址解析归属地
查看>>
启用日志调试Kerberos登录验证问题
查看>>
saltstack二次开发构建自己的api
查看>>
动手打造自己强大的右键菜单
查看>>
探测调试器
查看>>
图案研究2--九格定义
查看>>
通过串口关闭Linux服务器
查看>>
RHEL 5服务篇—使用Apache搭建web服务(四)部署AWStats网站分析系统
查看>>
SQL Serer闩锁 和 闩锁超时故障排除
查看>>
Logparser 分析 Exchange 日志文件
查看>>
KDE与GNOME的起源与发展
查看>>
Linux下Java开发环境的搭建Tomcat6+jdk6+eclipse3.5.2+Myeclipse9.0+mysql5.1.47
查看>>
部署Nagios监控系统(一)
查看>>
银行程序代发工资的方法
查看>>