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 相关文章推荐
文件上传类
Oct 09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
php学习之 循环结构实现代码
Jun 09 PHP
php中global和$GLOBALS[]的分析之一
Feb 02 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
Aug 14 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
php中读写文件与读写数据库的效率比较分享
Oct 19 PHP
windows7下php开发环境搭建图文教程
Jan 06 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
php实现二叉树中和为某一值的路径方法
Oct 14 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
图解上海144收音机
2021/03/02 无线电
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
学习JavaScript图片预加载模块
2016/11/07 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
Python中IPYTHON入门实例
2015/05/11 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Django中的ajax请求
2018/10/19 Python
Python正则表达式和元字符详解
2018/11/29 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
django model通过字典更新数据实例
2020/04/01 Python
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
大学生就业自荐信
2013/10/26 职场文书
给同学的道歉信
2014/01/16 职场文书
推广普通话标语
2014/06/27 职场文书
中秋晚会活动方案
2014/08/31 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
单位介绍信格式范文
2015/05/04 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
小数乘法教学反思
2016/02/22 职场文书
SQL SERVER中的流程控制语句
2022/05/25 SQL Server