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 相关文章推荐
Uchome1.2 1.5 代码学习 common.php
Apr 24 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
PHP控制前台弹出对话框的实现方法
Aug 21 PHP
php批量修改表结构实例
May 24 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
Apr 15 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 PHP
50个优秀经典PHP算法大集合 附源码
Aug 26 PHP
PHP哈希表实现算法原理解析
Dec 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无法访问远程mysql的问题分析及解决
2013/05/16 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
Python不规范的日期字符串处理类
2014/06/10 Python
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
详解Swift中属性的声明与作用
2016/06/30 Python
python魔法方法-属性访问控制详解
2016/07/25 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
python eventlet绿化和patch原理
2020/11/21 Python
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
有机童装:Toby Tiger
2018/05/23 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
网站创业计划书
2014/04/30 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
Python源码解析之List
2021/05/21 Python
浅析Django接口版本控制
2021/06/26 Python
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers
GO中sync包自由控制并发示例详解
2022/08/05 Golang