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
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
解析php session_set_save_handler 函数的用法(mysql)
Jun 29 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
Jan 15 PHP
PHP运行模式汇总
Nov 06 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 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不用递归遍历目录下所有文件的代码
2014/07/04 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
python基础教程之五种数据类型详解
2017/01/12 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
python config文件的读写操作示例
2019/09/27 Python
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
关于赌博的检讨书
2014/01/08 职场文书
毕业留言寄语大全
2014/04/10 职场文书
政府信息公开实施方案
2014/05/09 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
工作能力自我评价2015
2015/03/05 职场文书
学术会议通知范文
2015/04/15 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
团队拓展训练感想
2015/08/07 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android