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 set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
php中动态修改ini配置
Oct 14 PHP
php实现递归与无限分类的方法
Feb 16 PHP
初识laravel5
Mar 02 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
关于php中一些字符串总结
May 05 PHP
php 无限分类 树形数据格式化代码
Oct 11 PHP
php获取当前月与上个月月初及月末时间戳的方法
Dec 05 PHP
php获取今日开始时间和结束时间的方法
Feb 27 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
php adodb介绍
2009/03/19 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
php查看网页源代码的方法
2015/03/13 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
FLASH 广告之外的链接
2008/12/16 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
ajax异步请求详解
2017/01/06 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
Python转码问题的解决方法
2008/10/07 Python
Python的print用法示例
2014/02/11 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
全国文明单位申报材料
2014/05/31 职场文书
社区元宵节活动总结
2015/02/06 职场文书
Spring中bean集合注入的方法详解
2022/07/07 Java/Android