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级别的错误。该方法必须返回一个字符串。
12.__set_state(array $args)
当调用var_export($object)时会触发该方法,$args是对象属性的key-value。该方法必须被定义为public static。__set_state()魔术方法是一个与__clone()相似,却具有更强劲功能的方法,因为它可以有选择性地克隆,在保留自己的一部分属性的同时,又可以改变另一部分属性。
13.__clone()
当使用clone()方法克隆一个对象时,该方法会被调用。
14.__autoload()
__autoload()方法会在试图使用尚未被定义的类时自动调用。通过调用此方法,PHP脚本在出错失败前有了最后一个机会加载所需的类。
注意:在__autoload()中抛出的异常不能被
15.__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 魔术方法__set() __get() 方法详解
- PHP 魔术方法__set() __get() 方法详解
- PHP | 魔术方法 | __toString(),__clone(),__call(),__autoload() 详解
- PHP之十六个魔术方法详解
- PHP之十六个魔术方法详解
- PHP之十六个魔术方法详解 (一)
- 详解php的魔术方法__get()和__set()使用介绍
- php 魔术方法详解
- php常见的魔术方法详解
- 详解php魔术方法(Magic methods)的使用方法
- PHP中十六个魔术方法详解
- 详解php的魔术方法__get()和__set()使用介绍
- php 魔术方法详解
- PHP 中 16 个魔术方法详解
- 详解php的魔术方法__get()和__set()使用介绍
- PHP 中 16 个魔术方法详解
- PHP之十六个魔术方法详解
- php常见的魔术方法详解
- PHP 中 16 个魔术方法详解
- PHP 魔术方法详解