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中随机显示图片的函数代码
Jun 23 PHP
redis 队列操作的例子(php)
Apr 12 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
基于php使用memcache存储session的详解
Jun 25 PHP
php中AES加密解密的例子小结
Feb 18 PHP
php使用parse_url和parse_str解析URL
Feb 22 PHP
php实现网页缓存的工具类分享
Jul 14 PHP
WordPress的主题编写中获取头部模板和底部模板
Dec 28 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
Jul 28 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
php中取得URL的根域名的代码
2011/03/23 PHP
php 字符串替换的方法
2012/01/10 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
python 容器总结整理
2017/04/04 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python读取和保存视频文件
2018/04/16 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
Python的in,is和id函数代码实例
2020/04/18 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
Python实现石头剪刀布游戏
2021/01/20 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
工作自荐信
2013/12/11 职场文书
小学生秋游活动方案
2014/02/23 职场文书
《逃家小兔》教学反思
2014/02/23 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
学风建设演讲稿
2014/09/12 职场文书
2014年物流工作总结
2014/11/25 职场文书
国家助学金感谢信
2015/01/21 职场文书
工作会议通知
2015/04/15 职场文书
回复函格式及范文
2015/07/14 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
使用python创建股票的时间序列可视化分析
2022/03/03 Python
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
关于Redis的主从复制及哨兵问题
2022/06/16 Redis