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
中国站长站 For Dede4.0 采集规则
May 27 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
Aug 02 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
解读PHP中的垃圾回收机制
Aug 10 PHP
PHP6新特性分析
Mar 03 PHP
PHP实现Session入库/存入redis的方法
May 04 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 PHP
PHP时间函数使用详解
Mar 21 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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的错误信息
2006/10/09 PHP
人大复印资料处理程序_补充篇
2006/10/09 PHP
php 定义404页面的实现代码
2012/11/19 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
Python数据结构之Array用法实例
2014/10/09 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
解决python3输入的坑——input()
2020/12/05 Python
Django自带的用户验证系统实现
2020/12/18 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
先进班级集体事迹材料
2014/01/30 职场文书
党员违纪检讨书
2014/02/18 职场文书
党员承诺书格式
2014/05/21 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
房地产端午节活动方案
2014/08/24 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
52条SQL语句教你性能优化
2021/05/25 MySQL