PHP 构造函数和析构函数原理与用法分析


Posted in PHP onApril 21, 2020

本文实例讲述了PHP 构造函数和析构函数原理与用法。分享给大家供大家参考,具体如下:

构造函数

__construct ([ mixed $args [, $... ]] ) : void

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();
?>

为了实现向后兼容性,如果 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
  }
}

析构函数

__destruct ( void ) : 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 相关文章推荐
如何隐藏你的.php文件
Jan 04 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
解析mysql left( right ) join使用on与where筛选的差异
Jun 18 PHP
PHP生成RSS文件类实例
Dec 05 PHP
CI框架中site_url()和base_url()的区别
Jan 07 PHP
php检测url是否存在的方法
Apr 14 PHP
php实现的农历算法实例
Aug 11 PHP
php5.4传引用时报错问题分析
Jan 22 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
Nov 05 PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
PHP 对象继承原理与简单用法示例
Apr 21 #PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
Apr 20 #PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 #PHP
Laravel 框架控制器 Controller原理与用法实例分析
Apr 14 #PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 #PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 #PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 #PHP
You might like
php smarty模版引擎中的缓存应用
2009/12/11 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
PHP开发注意事项总结
2015/02/04 PHP
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
python中return不返回值的问题解析
2020/07/22 Python
Python分类测试代码实例汇总
2020/07/23 Python
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
求职者应聘的自我评价
2013/10/16 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
2015毕业寄语大全
2015/02/26 职场文书
求职简历自我评价范文
2015/03/10 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL
Python 全局空间和局部空间
2022/04/06 Python
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers