php魔术方法——构造函数和析构函数
2016-03-01 15:40
591 查看
php有一类很神奇的方法,这些方法是保留方法,通常不会在外部被显式调用,他们使用双下划线(__)开头,他们被称为魔术方法(Magic Methods)。php官方也不建议定义其他双下划线开头的方法。
这次介绍最常见的魔术方法:构造函数和析构函数。
1. 构造函数(__construct)
构造函数:拥有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象前做一些初始化服务。
注意:
1. clone并不会调用构造函数
2. 如果子类定义了构造函数,则不会隐式调用父类的构造函数
3. 子类的构造函数允许和父类的构造函数参数不一致
4. 如果子类没有定义构造函数,php会尝试寻找父类的构造函数
5. 如果父类没有定义构造函数,使用parent关键字显式调用父类构造函数,会导致致命错误
除了魔术方法的构造函数,php还支持与类名相同的构造函数,不过优先级比魔术方法低:
php5.3.3之后,在命名空间之内使用与类名同名的方法,不再作为构造函数,命名空间之外不变:
构造函数可以用全部三个访问控制修饰符,如单例模式:
2. 析构函数(__destruct)
析构函数:析构函数会在某个对象的引用被全部删除或对象被显示销毁时执行。
注意:
1. 同构造函数类似,父类的析构函数并不会被引擎暗中调用,必须显式调用parent::__destruct
2. exit和die并不能阻止析构函数的执行
3. 致命错误会阻止析构函数的执行
4. 在析构函数中调用exit,可以阻止其他未执行的析构函数的执行
5. 如果父类没有定义析构函数,使用parent关键字显式调用父类[b]析构函数,会导致致命错误[/b]
这次介绍最常见的魔术方法:构造函数和析构函数。
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关键字显式调用父类[b]析构函数,会导致致命错误[/b]
<?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 Ajax 跨域问题最佳解决方案
- smtplib 通过ssl端口发送邮件
- PHP内置函数和用户函数性能对比
- phpstudy易犯的错误
- Thinkphp5简单初体验
- 解析WordPress中控制用户登陆和判断用户登陆的PHP函数
- PHPExcel使用-使用PHPExcel导出文件-导出MySQL数据
- PHP函数中isset和array_key_exists的差异
- VC创建FTP客户端
- Yii初学者必看-yii 表单验证规则
- 编写PHP脚本清除WordPress头部冗余代码的方法讲解
- PHP连接sql server 2005环境配置
- Yii2 where
- Ubuntu上轻松实现PHP扩展
- contos安装laravel
- 学习笔记之PHP 基础
- php-fpm 启动参数及重要配置详解
- 20 个实用的 PHP 库(图表、图片、数据等)
- phpmyadmin如何查看索引
- 优化函数式编程:向 PHP 移植 Clojure 函数