首页 > 代码库 > php魔术方法罗列
php魔术方法罗列
##__sleep() 和 __wakeup()
当序列化(serialize)对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep() 。
__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
类似的,当使用 unserialize() 恢复对象时, 将调用 __wakeup() 成员函数。
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
##__construct(),__destruct()
如果子类中定义了构造函数则不会隐式调用其父类的构造函数。
要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct() 。
如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承并执行(假如没有被定义为 private 的话)。
自 PHP 5.3.3 起,在命名空间中,与类名同名的方法不再作为构造函数。非命名空间中的类依然可用。
析构函数基本同构造函数一样,得记住下面这一句话:析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。
##属性重载
##__get(),__set(),__isset(),__unset()
在给不可访问属性赋值时,__set() 会被调用。
读取不可访问属性的值时,__get() 会被调用。
当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
当对不可访问属性调用 unset() 时,__unset() 会被调用。
属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。
##方法重载
##__call(),__callStatic()
public mixed __call ( string $name , array $arguments )
public static mixed __callStatic ( string $name , array $arguments )
在对象中调用一个不可访问方法时,__call() 会被调用。
用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。
$name 参数是要调用的方法名称。 $arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
##__toString()
__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。
不能在 __toString() 方法中抛出异常。这么做会导致致命错误。
需要指出的是在 PHP 5.2.0 之前,__toString() 方法只有在直接使用于 echo 或 print 时才能生效。
PHP 5.2.0 之后,则可以在任何字符串环境生效(例如通过 printf() ,使用 %s 修饰符),但不能用于非字符串环境(如使用 %d 修饰符)。
自 PHP 5.2.0 起,如果将一个未定义 __toString() 方法的对象转换为字符串,会产生 E_RECOVERABLE_ERROR 级别的错误。
##__invoke() (PHP 5.3.0起)
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
本特性只在 PHP 5.3.0 及以上版本有效。
##__set_state() ( PHP 5.1.0 起)
static object __set_state ( array $properties )
自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。
本方法的唯一参数是一个数组,其中包含按 array(‘property‘ => value, ...) 格式排列的类属性。
##__clone()
对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。
当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。
单例模式中得禁止clone复制对象
具体例子见手册