本节内容:
php编程之魔术方法与魔术常量
PHP把类中所有以__(两个下划线)开头的方法当成魔术方法,一般建议用户不要将自定义的方法前面加上__作为前缀。
一,魔术方法:
1. __construct()
类的默认构造方法,如果__construct()和与类同名的方法共同出现时,默认调用__construct()而不是同类名方法。一般情况下用户自定义构造方法也会使用__construct()。
2. __destruct()
类的析构函数,当该对象的所有引用都被删除,或者对象被显式销毁时执行。
3. __get($name)
用$object->a的方式读取对象的属性时,如果属性a存在且是public型,那么直接返回该属性的值;如果属性a不存在或者是protected/private这样的不可直接访问的类型,就会调用__get($name)方法并以返回值为准。一般可以使用该方法使外部可限制性地访问内部属性,或者完成类似java中的反射操作。
4. __set($name, $value)
与__get($name)类似,用$object->a = 17的方式给属性赋值时,如果属性a存在且是public型,那么直接给属性a赋值皆可;如果属性a不存在或者是protected/private型,就会调用__set($name, $value)方法。
5. __call($name, $arguments) / __callStatic($name, $arguments)
当调用不存在或者不可访问的方法时,会调用__call($name, $arguments)方法。而当在静态方法中调用不存在或者不可访问的方法时,会调用__callStatic($name, $arguments)方法。
6. __toString()
当打印对象时会被直接调用。如echo $object;
7. __clone()
当对象被拷贝时直接调用。如$a = new Action(); $a = $object;
8. __isset($name) / __unset($name)
对不存在或者不可访问的属性使用isset()或者empty()时,__isset()会被调用;当unset一个不存在或者不可访问的属性时,__unset()会被调用,否则直接unset该属性皆可。
9. __set_state()
用var_export()输出一个对象时,__set_state()会被调用,输出内容以该魔术方法的返回值为准。
注:var_export()和var_dump()类似,只是var_export()输出的内容符合php语法。
注意,使用方法:
<?php
$test = new Test();
$b = var_export($test, true);
var_dump($b);
class Test {
public $a;
public static function __set_state($array) {
$ab = new Test();
$ab->a = 10;
return $ab;
}
}
11. __sleep() / __wakup()
略。
二,魔术常量:
PHP的魔术常量是通过扩展库定义的,比如以下几种魔术常量的值就会随着它们在代码中的位置改变而改变:
__LINE__ 该php文件中的当前行号
__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,如果用在被包含文件中,则返回被包含的文件名。__FILE__总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。
__FUNCTION__ 函数名称。自php5起本常量返回该函数被定义时的名字(区分大小写)。php4时总为小写字母。
__CLASS__类的名称。php5区分大小写,php4总为小写字母。
__METHOD__类的方法名,区分大小写,返回形式:class::function。
__NAMESPACE__ 当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的。