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桌面中心(三) 修改数据库
Mar 11 PHP
php图片上传存储源码并且可以预览
Aug 26 PHP
分享PHP header函数使用教程
Sep 05 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
PHP中使用asort进行中文排序失效的问题处理
Aug 18 PHP
php限制上传文件类型并保存上传文件的方法
Mar 13 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
php中namespace及use用法分析
Dec 06 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 PHP
php7 安装yar 生成docker镜像
May 09 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 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
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
Document 对象的常用方法
2009/07/31 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
[36:16]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.19
2020/12/24 DOTA
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
PyQt 如何创建自定义QWidget
2021/03/24 Python
学院领导推荐信
2013/10/30 职场文书
采购求职信
2014/03/17 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
优秀少先队员事迹材料
2014/12/24 职场文书
社会实践单位意见
2015/06/05 职场文书
初三数学教学反思
2016/02/17 职场文书
pytorch 使用半精度模型部署的操作
2021/05/24 Python