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()函数修改为你喜欢的函数名。

ThinkPHP中的__initialize()和类的构造函数__construct()的更多相关文章

  1. scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  2. scala入门教程:scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  3. ThinkPHP中使用PHPMailer邮件类

    第一步.添加PHPMailer类库将下载后的文件解压,将PHPMail目录移动至ThinkPHP目录中的Vendor内.(请确保class.phpmailer.php文件就在ThinkPHP\Vend ...

  4. ThinkPHP中数据库操作返回值总结

    转自:http://www.baiwar.com/post/thinkphp-database-operations-in-the-return-value.html Thinkphp中的Think\ ...

  5. C++:派生类的构造函数和析构函数

    4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...

  6. 【转】ThinkPHP中数据库操作返回值总结

    Thinkphp中的Think\Model类提供了数据库的基本CURD(Create.Update.Read及Delete),通过该类可以很便捷的进行操作.Model类及扩展类主要的方法有: Crea ...

  7. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  8. PHPEXCEL在thinkphp中封装成类使用

    PHPEXCEL在thinkphp中封装成类使用 标签: phpexcel导出导入thinkphp -- : 435人阅读 评论() 收藏 举报 分类: php() 版权声明:本文为博主原创文章,未经 ...

  9. C++中虚继承派生类构造函数的正确写法

    最近工作中某个软件功能出现了退化,追查下来发现是一个类的成员变量没有被正确的初始化.这个问题与C++存在虚继承的情况下派生类构造函数的写法有关.在此说明一下错误发生的原因,希望对更多的人有帮助. 我们 ...

随机推荐

  1. linux学习记录 常用指令大全

    1.开启关闭服务器(即时生效): service iptasbles start service iptasbles stop 2.在开启了防火墙时,做如下设置,开启相关端口, 修改/etc/sysc ...

  2. U盘制作Linux系统盘

    一.首先需要有一个U盘,最好能是8G及以上的 二.下载Linux的镜像文件(我这边安装的是red hat6.3) 下载路径:http://pan.baidu.com/s/1jIGYCKI 三.下载制作 ...

  3. Linux中oracle安装时候报ora-00119解决办法

    ORA-00119: invalid specification for system parameter LOCAL_LISTENER ORA-00130: invalid listener add ...

  4. ORACLE/MYSQL/DB2等不同数据库取前几条记录

    选取数据库中记录的操作是最基础最频繁的,但往往实际应用中不会这么简单,会在选取记录的时候加上一些条件,比如取前几条记录,下面就总结了如何在ORACLE/MYSQL/DB2等一些热门数据库中执行取前几条 ...

  5. OpenCV——KNN分类算法 <摘>

    KNN近邻分类法(k-Nearest Neighbor)是一个理论上比较成熟的方法,也是最简单的机器学习算法之一. 这个算法首先贮藏所有的训练样本,然后通过分析(包括选举,计算加权和等方式)一个新样本 ...

  6. poj2778DNA Sequence (AC自动机+矩阵快速幂)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud DNA Sequence Time Limit: 1000MS   Memory ...

  7. UVA11806Cheerleaders(容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题目意思:在m行n列的矩形网格中放k个相同的石子,问有多少中方法?每个格子最多放一 ...

  8. 多台服务之间共享Session

    一.问题:为了满足足够大的应用,满足更多的客户,就需要架设N台Web服务器(N>=2),在多台Web服务器的情况下,就会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的时候能够 ...

  9. linux下virtualenv的python版本

    virtualenv是python开发中一个重要的工具,它可以帮助我们创建一个干净的python解释环境,创建虚拟环境时,这个虚拟环境的 python版本往往是系统默认的2.x版本.别急,我们只需要一 ...

  10. httpd-vhosts.conf的配置

    <VirtualHost *:80> DocumentRoot "D:\product\web\Public" ServerName demo.web.com Dire ...