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

PHP中的魔术方法详解

2015-05-10 16:21 465 查看
PHP中的魔术方法一共有以下这些:__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__set_state(),__clone(),__autoload(),__invoke()

1.__construct()

__construct()是一个构造方法,具有构造方法的类会在每次创建对象时首先调用此方法。这个方法往往用于创建对象时执行一些初始化的操作,如给属性赋值、连接数据库等。

2.__destruct()

__destruct()是一个析构方法,当PHP确定你的脚本不再与对象相关或者对象被显式销毁时,析构函数将被调用:

如果对象是在一个函数里创建的,这会发生在函数return的时候;

如果对象是一个全局变量,这发生在脚本结束的时候;

将对象变量赋值为NULL或者调用unset()函数的时候;

3.__call(string $name, array $args)

当调用一个未定义的方法时会触发该方法(这里的未定义方法包括没有权限访问的方法)。该魔术方法必须被定义为public且非静态,否则会抛出一个warning级别的错误。

4.__callStatic(string $name, array $args)

当调用一个未定义的静态方法时会触发该方法(这里的未定义方法包括没有权限访问的方法)。该魔术方法必须被定义为public static,否则会抛出一个warning级别的错误。

5.__set(string $property)

当为一个未定义的属性赋值时会触发该方法(这里的未定义属性包括没有权限访问的属性)。

6.__get(string $property)

当访问一个未定义的属性时会触发该方法(这里的未定义属性包括没有权限访问的属性)。

7.__isset(string $property)

当在一个未定义的属性上使用isset()函数时会触发该方法(这里的未定义属性包括没有权限访问的属性)。

8.__unset(string $property)

当在一个未定义的属性上使用unset()函数时会触发该方法(这里的未定义属性包括没有权限访问的属性)。

9.__sleep()

当序列化一个对象时会触发该方法。__sleep()方法必须返回一个数组,包含需要序列化的属性名称,否则会导致一个Notice级别的错误。如果没有__sleep()方法,PHP将序列化所有属性。

10.__wakeup()

当反序列化一个对象时会触发该方法。__wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

11.__toString()

当尝试将一个对象转化为字符串时会触发该方法,例如echo一个对象时。如果没有定义该魔术方法而直接echo对象,会导致一个fatal级别的错误。该方法必须返回一个字符串。

class Student {
public function __toString() {
return 'I am a student!';
}
}

$stu = new Student();
echo $stu; // 输出I am a student!


12.__set_state(array $args)

当调用var_export($object)时会触发该方法,$args是对象属性的key-value。该方法必须被定义为public static。__set_state()魔术方法是一个与__clone()相似,却具有更强劲功能的方法,因为它可以有选择性地克隆,在保留自己的一部分属性的同时,又可以改变另一部分属性。

class Student {

public $name = 'Tom';
public $age = 13;

public static function __set_state(array $args) {
$stu = new self();
$stu->age = ++$args['age'];
return $stu;
}
}

$stu1 = new Student();
// 克隆一个比$stu1大一岁的$stu2
eval('$stu2 = ' . var_export($stu1, true) . ';');
// 输出name => Tom, age => 14
var_dump($stu2);


13.__clone()

当使用clone()方法克隆一个对象时,该方法会被调用。

14.__autoload()

__autoload()方法会在试图使用尚未被定义的类时自动调用。通过调用此方法,PHP脚本在出错失败前有了最后一个机会加载所需的类。

注意:在__autoload()中抛出的异常不能被
catch
语句块捕获并导致致命错误。


15.__invoke()

当以调用函数的方式调用一个对象时,该方法会被触发。

class Student {
public function __invoke() {
echo 'Hello World!';
}
}

$stu = new Student();
$stu(); // 输出Hello World!


以上内容转载自这里,部分内容有修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 魔术方法