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无限分类(树形类)的深入分析
Jun 02 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
PHP排序算法类实例
Jun 17 PHP
php开发微信支付获取用户地址
Oct 04 PHP
php阿拉伯数字转中文人民币大写
Dec 21 PHP
PHP动态生成指定大小随机图片的方法
Mar 25 PHP
Joomla开启SEF的方法
May 04 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
Jul 10 PHP
php微信公众号开发之简答题
Oct 20 PHP
laravel 获取当前url的别名方法
Oct 11 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
php SQL之where语句生成器
2009/03/24 PHP
PHP 事件机制(2)
2011/03/23 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
深入浅出php socket编程
2015/05/13 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
jquery 笔记 事件
2011/11/02 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
Python群发邮件实例代码
2014/01/03 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
怎样写好自我评价呢?
2014/02/16 职场文书
幸福家庭标语
2014/06/27 职场文书
股份合作协议书
2014/09/10 职场文书
红旗渠导游词
2015/02/09 职场文书
小学教师节活动总结
2015/03/20 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS