PHP中构造函数和析构函数解析


Posted in PHP onOctober 10, 2014

构造函数

void __construct ([ mixed $args [, $... ]] )

PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

Note: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。

Example#1使用新标准的构造函数

<?php

class BaseClass {

   function __construct() {

       print "In BaseClass constructor\n";

   }

}

 

class SubClass extends BaseClass {

   function __construct() {

       parent::__construct();

       print "In SubClass constructor\n";

   }

}

 

class OtherSubClass extends BaseClass {

    // inherits BaseClass's constructor

}

 

// In BaseClass constructor

$obj = new BaseClass();

 

// In BaseClass constructor

// In SubClass constructor

$obj = new SubClass();

 

// In BaseClass constructor

$obj = new OtherSubClass();

?>

output:
In BaseClass constructor
In BaseClass constructor
In SubClass constructor
In BaseClass constructor

为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct() 函数并且也没有从父类继承一个的话,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法却被用于其它用途时。

与其它方法不同,当 __construct() 被与父类 __construct() 具有不同参数的方法覆盖时,PHP 不会产生一个 E_STRICT 错误信息。

自 PHP 5.3.3 起,在命名空间中,与类名同名的方法不再作为构造函数。这一改变不影响不在命名空间中的类。

Example#2 Constructors in namespaced classes

<?php

namespace Foo;

class Bar {

    public function Bar() {

        // treated as constructor in PHP 5.3.0-5.3.2

        // treated as regular method as of PHP 5.3.3

    }

}

?>

析构函数

void __destruct(void)

PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

Example#3析构函数示例

<?php

class MyDestructableClass {

   function __construct() {

       print "In constructor\n";

       $this->name = "MyDestructableClass";

   }
   function __destruct() {

       print "Destroying " . $this->name . "\n";

   }

}
$obj = new MyDestructableClass();

?>

和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。

析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。

Note:
析构函数在脚本关闭时调用,此时所有的 HTTP 头信息已经发出。脚本关闭时的工作目录有可能和在 SAPI(如 apache)中时不同。
Note:
试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。

PHP 相关文章推荐
随机头像PHP版
Oct 09 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
Aug 17 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
Dec 25 PHP
功能强大的php分页函数
Jul 20 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
微信公众号OAuth2.0网页授权问题浅析
Jan 21 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
为你的 Laravel 验证器加上多验证场景的实现
Apr 07 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 PHP
PHP如何使用cURL实现Get和Post请求
Jul 11 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 #PHP
php返回json数据函数实例
Oct 09 #PHP
php常用的安全过滤函数集锦
Oct 09 #PHP
自定义session存储机制避免会话保持问题
Oct 08 #PHP
PHP定时任务延缓执行的实现
Oct 08 #PHP
在Win7 中为php扩展配置Xcache
Oct 08 #PHP
在win7中搭建Linux+PHP 开发环境
Oct 08 #PHP
You might like
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
PHP 组件化编程技巧
2009/06/06 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
python提取字典key列表的方法
2015/07/11 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
python3 拼接字符串的7种方法
2018/09/12 Python
python实现多线程端口扫描
2019/08/31 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
python生成器用法实例详解
2019/11/22 Python
Python list运算操作代码实例解析
2020/01/20 Python
什么是python类属性
2020/06/10 Python
详细分析Python collections工具库
2020/07/16 Python
教师节大会主持词
2015/07/06 职场文书
公司考勤管理制度
2015/08/04 职场文书
外科护士长工作总结
2015/08/12 职场文书
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL
详解JAVA的控制语句
2021/11/11 Java/Android
css3新特性的应用示例分析
2022/03/16 HTML / CSS
Linux中文件的基本属性介绍
2022/06/01 Servers