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中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
获取远程文件大小的php函数
Jan 11 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
php中的比较运算符详解
Oct 28 PHP
php判断表是否存在的方法
Jun 18 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 PHP
php简单实现sql防注入的方法
Apr 22 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
php基于环形链表解决约瑟夫环问题示例
Nov 07 PHP
PHP PDOStatement::errorInfo讲解
Jan 31 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 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使用CURL获取302跳转后的地址实例
2014/05/04 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
javascript 动态创建表格
2015/01/08 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
wxPython的安装与使用教程
2018/08/31 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
Flask配置Cors跨域的实现
2019/07/12 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
Django权限控制的使用
2021/01/07 Python
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
南京某公司笔试题
2013/01/27 面试题
户外亲子活动策划方案
2014/02/07 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
人民调解员培训方案
2014/06/05 职场文书
付款承诺函范文
2015/01/21 职场文书
工程部岗位职责
2015/02/10 职场文书
技术员岗位职责范本
2015/04/11 职场文书
幼儿园中班班级总结
2015/08/10 职场文书