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的控制语句
Oct 09 PHP
php下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
PHP新手入门学习方法
May 08 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
Jul 28 PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
Python生成随机密码的方法
2017/06/16 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
Python的互斥锁与信号量详解
2019/09/12 Python
Python如何实现动态数组
2019/11/02 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
家庭困难证明
2014/10/12 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
创业计划书之宠物店
2019/09/19 职场文书
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
MySQL 服务和数据库管理
2021/11/11 MySQL
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL