您的位置:首页 > 编程语言 > PHP开发

php魔术方法——构造函数和析构函数

2016-03-01 15:40 591 查看
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关键字显式调用父类[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
**/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: