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代码
Dec 06 PHP
PHP无限分类的类
Jan 02 PHP
php MYSQL 数据备份类
Jun 19 PHP
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
PHP实现过滤掉非汉字字符只保留中文字符
Jun 04 PHP
php之static静态属性与静态方法实例分析
Jul 30 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
laravel学习教程之关联模型
Jul 30 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 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中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
微信小程序实现单选功能
2018/10/30 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
微信小程序实现多张图片上传功能
2020/11/18 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
python多线程编程方式分析示例详解
2013/12/06 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
python相对企业语言优势在哪
2020/06/12 Python
keras得到每层的系数方式
2020/06/15 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
公司活动策划方案
2014/01/13 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
导游词之山海关
2019/12/10 职场文书
python数据处理之Pandas类型转换
2022/04/28 Python