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程序员的13个好习惯小结
Feb 20 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
May 07 PHP
php获取apk包信息的方法
Aug 15 PHP
php合并数组中相同元素的方法
Nov 13 PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
php curl 上传文件代码实例
Apr 27 PHP
php邮箱地址正则表达式验证
Nov 13 PHP
YII Framework框架教程之缓存用法详解
Mar 14 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
PHP7中I/O模型内核剖析详解
Apr 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
linux iconv方法的使用
2011/10/01 PHP
php调整服务器时间的方法
2015/04/03 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
Python中统计函数运行耗时的方法
2015/05/05 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python多线程爬虫简单示例
2016/03/04 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
毕业生实习鉴定
2013/12/11 职场文书
英语教师自荐信
2014/05/26 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
2014年营销工作总结
2014/11/22 职场文书
订货会邀请函
2015/01/31 职场文书
2014年底个人工作总结
2015/03/10 职场文书
医院志愿者活动总结
2015/05/06 职场文书
《去年的树》教学反思
2016/02/18 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang