__construct()和__initialize()

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

 

 

http://www.thinkphp.cn/code/367.html

转载于:https://www.cnblogs.com/guke/p/3915266.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

荣耀6手机常显示无法链接服务器怎么处理,华为手机连接上WiFi上不了网怎么办...

华为手机(Mate7,荣耀6 Plus,荣耀6,P7) 连接上WiFi上不了网怎么办每当小编被遇到这样的问题,小编都会深深的醉一把。这样的问题就应该被消灭在火星上,谁让他来地球的。网络就像一张大网,哪个节点有问题都可能导致WIFI连上无法上网,…

初学之道--MFC

放假了,由于作业需要,我开始学习了一下MFC,一开始不知道如何下手,对MFC消息的运行和管理都一概不知,稀里糊涂的去看windows核心编程教学,才知道什么叫看天书, 然后又下载了vs2010开发指南PDF来看…

三国轶事——巴蜀之危

三国佚事——巴蜀之危 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 话说天下大势,分久必合,合久必分。。。却道那魏蜀吴三国鼎力之时,多少英雄豪杰以热血谱写那千古之绝唱。古人诚不我欺,确…

jquery ajax是什么意思,Jquery ajax

题目1: jQuery 中, $(document).ready()是什么意思?当html文档DOM树加载完成,执行ready里的函数。传递处理函数给.ready()方法,能保证DOM准备好后就执行这个函数,因此,这里是进行所有其它事件绑…

jboss 配置上下文路径_JBoss Portal上的“ Hello World” portlet

jboss 配置上下文路径Portlet概述 本教程将向您展示如何创建和部署简单的Portlet。 Portlet是基于Java技术的Web组件,可以处理请求并生成动态内容。 Portlet不是自治实体,但是由Portlet容器管理,Portlet容器为Portlet执行提供了必要的运行时…

创建型-工厂方法模式

1、工厂方法模式意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 工厂方法模式用于为属于同一类别的产品定义对应的具体工厂类,并将具体工厂类开放给用户类来使用。 2、应用场景&…

ajax前台multipartfile,在SpringBoot中使用Ajax方式MultipartFile上传失败

虽然在正常的html和表单方式下上传效果很好,但是切换到ajax却失败了,并且在调试模式下MultipartFile总是Null。code below works fine//html code//java codeRequestMapping(value "/api/upload", consumes "*/*", method Reques…

简单图片浏览器

在设置开关灯的时候出了一点小问题,默认UISwitch为on当用if(sender.on)做判断时,第一次点击无效。后来调试默认为on,当改变状态时sender.on返回的是0,再次点击返回的是1。判断一个UISwitch为off可以用!sender.on 用到加载本地目录…

服务器添加角色显示灰色,添加角色 web服务器 灰色

添加角色 web服务器 灰色 内容精选换一换OneAccess支持通过AD认证用户身份和控制权限。AD全称Active Directory,中文名称活动目录。您可以将AD简单理解成一个数据库,其存储有关网络对象的信息,方便管理员和用户查找所需信息。本文主要介绍One…

Hdu1166单点更新线段树

入门线段树&#xff0c;单点更新。写了几遍&#xff0c;都是学着notonlysuccess写的。 #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #in…

jboss4.2.3_JBoss 4.2.x Spring 3 JPA Hibernate教程

jboss4.2.3在花费大量时间在网上搜索之后&#xff0c;尝试找到对几个项目使用Spring&#xff0c;JPA和Hibenate的最有效方法&#xff0c;我们得出了将在下面介绍的配置的结论。 将Spring与JPA和Hibernate集成包括几个步骤&#xff1a; Spring容器的配置 JPA ORM层的配置 Hib…

虚拟服务器关机怎么开,云服务器关机了怎么开启

云服务器关机了怎么开启 内容精选换一换开启防护后&#xff0c;您可以根据需要进行安全配置。包括配置常用登录地、常用登录IP、SSH登录IP白名单&#xff0c;开启恶意程序自动隔离查杀功能。配置常用登录地后&#xff0c;企业主机安全服务将对非常用地登录主机的行为进行告警。…

web文件怎么传到服务器,web文件传到服务器

web文件传到服务器 内容精选换一换工具中所有涉及上传文件功能的&#xff0c;如果需要上传的文件大于1GB或者解压后超过剩余磁盘空间的一半&#xff0c;则需要释放磁盘空间或手动将文件上传至服务器&#xff0c;其他情况可通过Web界面上传功能上传。Web服务端证书&#xff0c;即…

(转)iOS面试题目

1、Object-C有多继承吗&#xff1f;没有的话用什么代替&#xff1f;cocoa 中所有的类都是NSObject 的子类 多继承在这里是用protocol 委托代理 来实现的 你不用去考虑繁琐的多继承 ,虚基类的概念. ood的多态特性 在 obj-c 中通过委托来实现. 2、Object-C有私有方法吗&#xff1…

Queue Explorer过期处理

Queue Explorer是收费软件,用一段时间后会显示过期界面无法使用&#xff0c; 我们可以删除注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Cogin\QueueExplorerPRO 下的项 然后继续使用该软件转载于:https://www.cnblogs.com/event/p/3935425.html

weblogic ejb_使用Oracle WebLogic对应用程序外部的EJB的引用

weblogic ejb在之前的文章中&#xff0c;我们对EJB 3.0版及其为您提供的构建Java EE应用程序的可移植机制进行了概述。 由于Java EE规范都是关于可移植性的&#xff0c;因此冒着重复自我的风险&#xff0c;我们经常强调EJB v。3.0规范上仍然存在最重要的可移植性限制&#xff1…

Android Studio显示行数

Android Studio在打开的文件左側单击鼠标右键&#xff0c;也能像Eclipse一样设置显示代码行数&#xff0c;如图1。可是这边跟Eclipse有一个非常大的差别&#xff0c;Eclipse设置后&#xff0c;其余的相应文件也跟着生效&#xff0c;即使文件关闭后又一次打开行数也还是会显示&a…

Java集合---HashSet的源码分析

一、 HashSet概述&#xff1a; HashSet实现Set接口&#xff0c;由哈希表&#xff08;实际上是一个HashMap实例&#xff09;支持。它不保证set 的迭代顺序&#xff1b;特别是它不保证该顺序恒久不变。此类允许使用null元素。 二、 HashSet的实现&#xff1a; 对于HashSet而言&…

lambda语法_Java Lambda语法替代

lambda语法关于lambda-dev邮件列表的讨论已经开始解决lambdas /函数文字的Java语言语法应该是什么样的问题。 让我们看一个稍微平凡的例子&#xff0c;然后尝试弄清楚问题。 Perl的人有一个很好的例子&#xff0c;说明以某种功能性的方式使用函数引用–他们称其为Schwartzian变…

CSDN论坛上的一道算法题

源地址为&#xff1a;http://bbs.csdn.net/topics/390854089 昨天晚上在CSDN论坛上看到这道题&#xff0c;思索一番后想到一个解决方案&#xff0c;也简单实现了。今天早上把博客补一补。算是做个笔记吧。 题目&#xff1a; 有m个人面向南方站成一排(m ≥1)&#xff0c;每喊一次…