php魔术方法——构造函数和析构函数
php有一类很神奇的方法,这些方法是保留方法,通常不会在外部被显式调用,他们使用双下划线(__)开头,他们被称为魔术方法(Magic Methods)。php官方也不建议定义其他双下划线开头的方法。
这次介绍最常见的魔术方法:构造函数和析构函数。
1. 构造函数(__construct)
void __construct ([ mixed $args [, $... ]] )
构造函数:拥有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象前做一些初始化服务。
注意:
1. clone并不会调用构造函数
2. 如果子类定义了构造函数,则不会隐式调用父类的构造函数
3. 子类的构造函数允许和父类的构造函数参数不一致
4. 如果子类没有定义构造函数,php会尝试寻找父类的构造函数
5. 如果父类没有定义构造函数,使用parent关键字显式调用父类构造函数,会导致致命错误
<?php class P{ public function __construct(){
echo __CLASS__ . "\n";
} } class C1 extends P{ public function __construct(){
echo __CLASS__ . "\n";
} } class C2 extends P{ public function __construct(){
parent::__construct();
echo __CLASS__ . "\n";
} } class C3 extends P{ } // P
$ins = new P(); // Nothing
$ins2 = clone $ins; // C1
new C1(); // P
// C2
new C2(); // P
new C3();
除了魔术方法的构造函数,php还支持与类名相同的构造函数,不过优先级比魔术方法低:
<?php class C1{ public function C1(){
echo __CLASS__ . "1\n";
} public function __construct(){
echo __CLASS__ . "2\n";
} } class C2{ public function C2(){
echo __CLASS__ . "1\n";
} } class C3{ public function C3(){
echo __CLASS__ . "1\n";
} public function __construct(){
echo __CLASS__ . "2\n";
$this->C3();
} } // C12
new C1(); // C21
new C2(); // C32
// C31
new C3();
php5.3.3之后,在命名空间之内使用与类名同名的方法,不再作为构造函数,命名空间之外不变:
<?php namespace N; class C{ public function C(){
echo __CLASS__ . "\n";
} } // Nothing
new \N\C();
构造函数可以用全部三个访问控制修饰符,如单例模式:
<?php class Single{ public static function getInstance(){
static $ins = null;
if(empty($ins)){
$ins = new self();
}
return $ins;
} private function __construct(){
echo __CLASS__ . "\n";
} } // Single
Single::getInstance();
2. 析构函数(__destruct)
void __destruct ( void )
析构函数:析构函数会在某个对象的引用被全部删除或对象被显示销毁时执行。
注意:
1. 同构造函数类似,父类的析构函数并不会被引擎暗中调用,必须显式调用parent::__destruct
2. exit和die并不能阻止析构函数的执行
3. 致命错误会阻止析构函数的执行
4. 在析构函数中调用exit,可以阻止其他未执行的析构函数的执行
5. 如果父类没有定义析构函数,使用parent关键字显式调用父类析构函数,会导致致命错误
<?php class P{ function __destruct(){
echo get_class($this) . "\t" . __CLASS__ . "\n";
}
} class C1 extends P{ function __destruct(){
echo get_class($this) . "\t" . __CLASS__ . "\n";
} } class C2 extends P{ function __destruct(){
parent::__destruct();
echo get_class($this) . "\t" . __CLASS__ . "\n";
} } class C3 extends P{ } $insP = new P();
$ins1 = new C1();
$ins2 = new C2();
$ins3 = new C3(); /**
输出:
C3 P
C2 P
C2 C2
C1 C1
P P
**/
php魔术方法——构造函数和析构函数的更多相关文章
- php部分---面向对象静态、抽象类、oop接口、加载类、魔术方法、关键字。
静态 static关键字 普通成员普通成员是属于对象的 静态成员静态成员是属于类的 普通方法里面可以调用静态成员静态方法里面不能调用普通成员self关键字 在类里面代表该类 普通类class Ren ...
- 走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)
类的成员简介 在C++中,可以通过声明一个类来穿件一种新的类型.类将一组变量(他们的类型通常不同)和一组相关的函数组合在一起.类可以有各种类型的变量组成,还可以包含其他类对象.成员变量称为数据成员它们 ...
- 前端学PHP之面向对象系列第二篇——魔术方法
× 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...
- php魔术方法罗列
##__sleep() 和 __wakeup() 当序列化(serialize)对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep() .__sleep() 方法常用于提交未提交 ...
- php中常用魔术方法的举例
魔术方法是php面向对象特有的功能,并且有时候能实现意想不到的效果,包括前面提到的构造函数.析构函数.还有__clone函数,另外再简单的介绍几个: 1.__toSring和__invoke clas ...
- php部分---面向对象:定义、实例化、构造函数、析构函数;
类 − 定义了一件事物的抽象特点.类的定义包含了数据的形式以及对数据的操作. 对象 − 是类的实例.一切皆对象.由类实例化出来的. 成员变量 − 定义在类内部的变量.该变量的值对外是不可见的,但是可以 ...
- php拦截器(魔术方法)
什么是PHP拦截器? 英文名称 “interceptor”,作用是 拦截 发送未定义的方法和属性的消息. 先看一段代码,定义了一个School类,实例化一个对象$obj,获取一个未定义的属性teach ...
- PHP中的面向对象OOP中的魔术方法
一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在ne ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
随机推荐
- 一个坑:java.sql.ResultSet.getInt==》the column value; if the value is SQL NULL, the value returned is 0
Retrieves the value of the designated column in the current row of this ResultSet object as a String ...
- Android 应用框架 —— 组件
本文内容根据个人自学整理记录,理解不当之处,希望大家批评指正,大家相互学习,写学习归纳,写博客是个好习惯,希望能够坚持下去. 在前一篇文章当中介绍了Android 的系统框架,主要是为了让大家对And ...
- SPOJ694 -- DISUBSTR 后缀树组求不相同的子串的个数
DISUBSTR - Distinct Substrings Given a string, we need to find the total number of its distinct su ...
- hdu5136:组合计数、dp
题目大意: 求直径长度为N的无根二叉树的个数(同构的只算一种) 分析: 分析发现直径长度不好处理!因此考虑把问题转化一下: 假设要求直径为N的二叉树 (1) 若N为偶数,将树从直径中点的边断开,则分成 ...
- HDU5140---Hun Gui Wei Company (主席树)
主席树太强大了,,如果仅仅用来求第k大就太屈才了..貌似和HDU4605差不多,那个是在图上根据点的顺序建立主席树,这个是根据年龄大小 或者等级高低建立主席树. 题意 大致就是一个二维区间的求和,但是 ...
- [置顶] 【Git入门之十】Rebase操作
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309627 Rebase,衍合?变基?唉,我也不知道要怎么翻译合适...变 ...
- css样式-表格优化
1.表格的初步优化 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...
- RTX51 Tiny实时操作系统学习笔记—初识RTX51 Tiny
一,RTX51 Tiny简单介绍 RTX51 Tiny是一种实时操作系统(RTOS),能够用它来建立多个任务(函数)同一时候运行的应用(从宏观上看是同一时候运行的,但从微观上看,还是独立运行的 ...
- XCode 打包问题巧遇
XCode 打包问题巧遇 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句: ...
- 开源中国安卓client源代码学习(一) 渐变启动界面
开源中国安卓client源代码学习(一) 渐变启动界面 准备学习安卓开发, 看到网上有人推荐开源中国安卓client的源代码, 说里面包括了大部分技术, 于是准备好好研究研究. 特开通此系列博客来记录 ...