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 相关文章推荐
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
PHP中使用imagick生成PSD文件缩略图教程
Jan 26 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
php代码检查代理ip的有效性
Aug 19 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 PHP
详解PHP文件的自动加载(autoloading)
Feb 04 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 PHP
laravel使用Faker数据填充的实现方法
Apr 12 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
基于mysql的bbs设计(四)
2006/10/09 PHP
php 获取mysql数据库信息代码
2009/03/12 PHP
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
实例分析python3实现并发访问水平切分表
2018/09/29 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
Python气泡提示与标签的实现
2020/04/01 Python
上课看小说检讨书
2014/02/22 职场文书
英文自荐信常用句子
2014/03/26 职场文书
找工作求职信
2014/07/07 职场文书
2014年党建工作总结
2014/11/11 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
企业培训简报范文
2015/07/20 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js