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生成自己的LOG文件
Oct 09 PHP
第十三节 对象串行化 [13]
Oct 09 PHP
如何去掉文章里的 html 语法
Oct 09 PHP
五款常用mysql slow log分析工具的比较分析
May 22 PHP
解析php中获取系统信息的方法
Jun 25 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
PHP答题类应用接口实例
Feb 09 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
Jan 09 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
Nov 21 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
PHP设计模式之PHP迭代器模式讲解
Mar 22 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
Jun 05 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 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
php实现三级级联下拉框
2016/04/17 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
js实现小星星游戏
2020/03/23 Javascript
Python文件读写保存操作的示例代码
2018/09/14 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
商务英语应届生自我鉴定
2013/12/08 职场文书
体操比赛口号
2014/06/10 职场文书
高三语文复习计划
2015/01/19 职场文书
签约仪式致辞
2015/07/30 职场文书
安全生产协议书
2016/03/22 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
Python正则表达式中flags参数的实例详解
2022/04/01 Python