php构造和析构方法,php5构造函数与析构函数实例
自php5起,有了构造函数与析构函数。
这使得php更富有面向对象的魅力了。
在php4时,构造函数用的是与类同名的函数来进行构造这个动作。
例如:
复制代码 代码示例:
/*
* myclass.php
*/
class myclass {
function myclass {
print "this is myclass\n";
}
}
//创建一个新的实例
$obj = new myclass();
?>
将以上代码保存为myclass.php,运行后,会打印出 this is myclass字样。这是php4的构造函数(当然,为了兼容,php5也可以这样写)。
在php5里,有了专门的构造和析构函数。__construct()和__destruct() 。再重新改写这个myclass.php。
复制代码 代码示例:
/*
* myclass.php
*/
class myclass {
function __construct() {
print "constructor\n";
}
function __destruct() {
print "destroying\n";
}
}
//创建一个新的实例
$obj = new myclass();
?>
保存以后发现打印出了"constructor destroying"。说明构造和析构的确发生了。
目前为止,没有任何问题。在php5的手册里,对于使用__construct还有段说明。如下:
为了实现向后兼容性(指php 4),如果 php 5 在类中找不到 __construct() 函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法,但它却又不是构造函数。
再来看一种情况,当一个派生类继承了基类并且这两个类都存在构造和析构函数的时候会出现什么眼的状况呢?
php 5对此的处理手段是: 隐藏基类的构造和析构!
代码:
复制代码 代码示例:
/*
* myclass.php
*/
class baseclass {
function __construct() {
print "baseclass:\n constructor ";
}
function __destruct() {
print "baseclass:\n destroying ";
}
}
class subclass extends baseclass {
function __construct() {
print "subclass:\n constructor ";
}
function __destruct() {
print "subclass:\n destroying ";
}
}
$obj = new subclass();
?>
保存运行后,结果打印:subclass: constructor subclass: destroying
可以看到,基类的构造与析构并没有发生。
这不得不让人费解,为什么php5会采取这种的机制呢?
c++的构造与析构的过程是:基类构造->派生类构造->派生类析构->基类析构。这才是成熟的机制。为什么php 5 会标新立异?
很显然,这种做法并不十分的明智。
翻看php手册找到一种说法:
php 4 不会从派生类的构造函数中自动调用基类的构造函数。恰当地逐次调用上一级的构造函数是用户的责任。 (php 4)
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。 (php 5)
可惜这两种说法并不足以令人信服。既然已经存在了构造,为何还得用手工调用?
php构造和析构方法,php5构造函数与析构函数实例相关推荐
- php 派生类 构造,C++派生类的构造函数和析构函数
派生类对象中包含基类对象,因此派生类对象在创建时,除了要调用自身的构造函数进行初始化外,还要调用基类的构造函数初始化其包含的基类对象.因此,程序中任何能够生成派生类对象的语句,都要说明其包含的基类对象 ...
- php 构造函数 返回值,php构造函数与析构函数实例分析
本节内容: php构造函数与析构函数 例子: 复制代码 代码示例: class Person{ public $name; public $age; public function __constru ...
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第32讲:PHP 构造方法、析构方法
陈力:传智播客古代 珍宝币 泡泡龙游戏开发第32讲:PHP 构造方法.析构方法 构造方法__construct()的主要作用是完成对新对象的初始化,没有返回值,析构方法__destruct的作用主要用 ...
- C++系列总结——构造与析构
前言 在使用资源前,我们需要做一些准备工作保证资源能正常使用,在使用完资源后,我们需要做一些扫尾工作保证资源没有泄露,这就是构造与析构了,这和编程语言是无关的,而是使用资源的一种方式.C++只不过是把 ...
- C++父类与子类间构造,析构,拷贝的调用关系
C++父类与子类间构造,析构,拷贝的调用关系 构造 子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数 默认执行无参构造 #include <iostream> #incl ...
- 【Swift学习】Swift编程之旅---析构方法(十九)
在一个类的实例内存被释放之前,析构方法被立即调用.使用deinit关键字来声明析构方法,类似于构造方法用init来声明.析构方法只适用于类类型. 析构方法原理 Swift会自动释放不再需要的实例以释放 ...
- 第8.18节 Python类中内置析构方法__del__
一. 引言 基本上所有支持OOP设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...
- 何时调用构造函数和析构函数
何时调用构造函数和析构函数 构造函数的作用是保证每个对象的数据成员都有何时的初始值. 析构函数的作用是回收内存和资源,通常用于释放在构造函数或对象生命期内获取的资源. 一般我们都知道构造和析构的次序: ...
- C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配
一.构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构 ...
最新文章
- 使用 ASP.NET 加密口令
- C#开发中关于加密解密字符串的使用方法
- 我自学python的路-Python的学习路经
- Flash as3 以鼠标点为中心缩放效果
- background-position减少小图片的连接数
- 深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?
- LinkedList源码学习
- 高质量代码才能最快投入生产
- PHP判断升级,版本检测升级(更新)库
- 使用PostgreSQL进行中文全文检索
- 设计模式系列- 迭代器模式
- centos7安装lamp
- UnityWebPlayer缓存清理工具
- 北京易思汇商务服务有限公司 留学缴费
- 把握大都市的高度和速度
- DB2数据库相关操作
- 十个优质编程网站,程序员们赶紧看过来!
- Object类型转换为Integer:
- 在公司三年跌宕起伏的经历
- Cisco路由器配置教程