php面向对象之构造函数和析构函数
php面向对象之构造函数和析构函数
简介
php面向对象支持两种形式的构造函数和析构函数,一种是和类同名的构造函数(php5.5之前),一类是魔术方法(php5.5之后)。与类名相同的构造函数优先级比魔术方法低。
php有一类很神奇的方法,这些方法是保留方法,通常不会在外部被显式调用,他们使用双下划线(__)开头,他们被称为魔术方法(Magic Methods)。php官方也不建议定义其他双下划线开头的方法。
这次介绍最常见的魔术方法:构造函数和析构函数。
1. 构造函数(__construct)
void __construct ([ mixed $args [, $... ]] )
构造函数:拥有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象前做一些初始化服务。
注意:
1. clone并不会调用构造函数
2. 如果子类定义了构造函数,则不会隐式调用父类的构造函数
3. 子类的构造函数允许和父类的构造函数参数不一致
4. 如果子类没有定义构造函数,php会尝试寻找父类的构造函数
5. 如果父类没有定义构造函数,使用parent关键字显式调用父类构造函数,会导致致命错误
1 <?php
2
3 class P{
4
5 public function __construct(){
6 echo __CLASS__ . "\n";
7 }
8
9 }
10
11 class C1 extends P{
12
13 public function __construct(){
14 echo __CLASS__ . "\n";
15 }
16
17 }
18
19 class C2 extends P{
20
21 public function __construct(){
22 parent::__construct();
23 echo __CLASS__ . "\n";
24 }
25
26 }
27
28 class C3 extends P{
29
30 }
31
32 // P
33 $ins = new P();
34
35 // Nothing
36 $ins2 = clone $ins;
37
38 // C1
39 new C1();
40
41 // P
42 // C2
43 new C2();
44
45 // P
46 new C3();
除了魔术方法的构造函数,php还支持与类名相同的构造函数,不过优先级比魔术方法低:
1 <?php
2
3 class C1{
4
5 public function C1(){
6 echo __CLASS__ . "1\n";
7 }
8
9 public function __construct(){
10 echo __CLASS__ . "2\n";
11 }
12
13 }
14
15 class C2{
16
17 public function C2(){
18 echo __CLASS__ . "1\n";
19 }
20
21 }
22
23 class C3{
24
25 public function C3(){
26 echo __CLASS__ . "1\n";
27 }
28
29 public function __construct(){
30 echo __CLASS__ . "2\n";
31 $this->C3();
32 }
33
34 }
35
36 // C12
37 new C1();
38
39 // C21
40 new C2();
41
42 // C32
43 // C31
44 new C3();
php5.3.3之后,在命名空间之内使用与类名同名的方法,不再作为构造函数,命名空间之外不变:
1 <?php
2
3 namespace N;
4
5 class C{
6
7 public function C(){
8 echo __CLASS__ . "\n";
9 }
10
11 }
12
13 // Nothing
14 new \N\C();
构造函数可以用全部三个访问控制修饰符,如单例模式:
1 <?php
2
3 class Single{
4
5 public static function getInstance(){
6 static $ins = null;
7 if(empty($ins)){
8 $ins = new self();
9 }
10 return $ins;
11 }
12
13 private function __construct(){
14 echo __CLASS__ . "\n";
15 }
16
17 }
18
19 // Single
20 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
/*php5.5以后用这个魔术常量来写我们的构造函数
function __constrct([参数列表]){ 方法体//通常用来对成员属性进行初始化赋值 }
* */
class Person{
public $userName;
public $age; function __construct($userName,$age){
echo '我是构造函数,我在new对象的时候会被调用';
$this->userName = $userName;
$this->age = $age;
}
function __destruct(){
echo '我是析构函数,我在对象被销毁的时候调用';
}
}
// $p = new Person();
$p = new Person("Clive", 27);
echo '<hr/>';
echo $p->age;
echo '<hr/>';
echo $p->userName;
$p = null;
/*析构函数
* function __destruct() { }
*
* */

23、构造函数在new对象的时候调用,23行,系统自动调用
28、析构函数在对象已经没有引用的时候调用,比如28行,系统自动调用
php面向对象之构造函数和析构函数的更多相关文章
- .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]
构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...
- php之面向对象、构造函数、析构函数
<!DOCTYPE HTML> <html> <head> <title></title> <meta charset="u ...
- Python笔记_第三篇_面向对象_2.构造函数和析构函数(含self说明)
1. 构造函数: 为什么要有构造函数? 打一个比方:类的创建就是好比你创建了好了一种格式的房间,你租给上一个住户的后,里面会对方很多“垃圾”和不规则的物品摆放.构造函数就是下一个住户再使用的时候进行物 ...
- 《挑战30天C++入门极限》C++面向对象编程入门:构造函数与析构函数
C++面向对象编程入门:构造函数与析构函数 请注意,这一节内容是c++的重点,要特别注意! 我们先说一下什么是构造函数. 上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们 ...
- PHP面向对象学习-属性 类常量 类的自动加载 构造函数和析构函数 访问控制(可见性)
在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性.静态属性则是用 ::(双冒号):self::$ ...
- PHP面向对象——构造函数、析构函数
在PHP中构造函数和析构函数是固定的,如下: // 构造函数 function __construct([argument1,argument2,...,argumentN]){ /* Class i ...
- php 的 构造函数 和 析构函数
构造函数 在C++ java里的应用及其普遍,今天好好研究了一下 php 的 构造函数 和 析构函数 构造函数 和 析构函数 构造函数 void __construct ([ mixed $args ...
- C++构造函数和析构函数,以及构造函数特殊成员变量和函数的初始化
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- PHP面向对象 实例化 构造函数 封装 继承 静态
PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...
随机推荐
- Npgsql使用入门(三)【批量导入数据】
Program.cs代码: class Program { static void Main(string[] args) { var test = new PgBulkCopyHelper<S ...
- JavaScript实现数字时钟功能
<html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...
- 如何解决Android 5.0以上出现的警告:Service Intent must be expli
有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent must be explitict,也就是说从Lollip ...
- Vue中的v-model与my97日期选择插件冲突
Vue中的v-model指令只是一个语法糖,其具体实现是:监听input框的input事件,然后将用户输入的值赋值给input框的value属性 <input type="text&q ...
- python网络编程part1
1. 网络架构 单机 单机游戏 以下两个基于网络的 CS架构 客户端游戏 cs--->client客户/server服务 你自己是客户端(消费)--->服务端(收钱) 服务端(应用程序)一 ...
- day25-1 time,datetime模块
目录 time 为什么要有time模块,time模块有什么用 时间戳形式 格式化时间 结构化时间 各种时间格式互相转换 datetime 为什么要有datetime模块,detatime模块有什么用 ...
- 【真·干货】MySQL 索引及优化实战
热烈推荐:超多IT资源,尽在798资源网 声明:本文为转载文章,为防止丢失所以做此备份. 本文来自公众号:GitChat精品课 原文地址:https://mp.weixin.qq.com/s/6V7h ...
- MySQL-字符类型与约束条件
创建表完整的语法: create table 表名(字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度) 约束条件],字段名3 类型[(宽度) 约束条件]); 注意事项: 1. 在同一张表中 ...
- Edit Distance FZU-1434
题目大意: 给你两个字符串A,B,和以下三种操作: 1.删除一个字符 2.插入一个字符 3.把一个字符改变成另一个字符 求使A变成B所需要的最少的操作: 我刚开始的思路是以为求出最长公共子序列,然后对 ...
- 园区IP地址规划(非常详细)
转:https://mp.weixin.qq.com/s/Zlm7x5eunIYLAG7Sp0yVCQ 经过这些年工作,接触从几万.几十万到上亿的项目都有: 我简单总结了接触的大部分的项目,将园区网核 ...