Prefix
PHP把所有__
开头的方法当做魔术方法,所以任何自定义的方法都不能是__
开头 php提供的重载,是指动态的创建属性或方法。重载是通过魔术方法来实现的。这些魔术方法的参数不能饮用传递,__get()
、__set()
、 __isset()
、__unset()
实现类属性重载。
__get()
当访问类中不可访问的属性时,将调用__get()
方法
Rule
当访问类中不可访问的属性时,根据不同的情况会调用__get()
、__set()
、__isset()
、__unset()
,其中当访问属性时,使用函数isset()
或empty()
时,将调用__isset()
方法,使用unset()
函数时,将调用__unset()
方法。
static
这四个方法不能使用static
关键词定义,在php5.3.0后,一个warning
级别的警告将发生,当使用static
方法定义这4个方法。
不可访问属性
何谓不可访问的属性:
- 类中没有的属性
- 私有变量在类外被访问
方法重载,通过__call()
和__callstatic()
来实现,两者的区别是一个上下文环境是不是静态方法,__callstatic()
在调用不可访问的静态方法时会被调用,它是在php5.3.0中才被添加。
__sleep() / __wakeup()
serialize()
序列化时,会先检查是否存在__sleep()
函数,如果存在,则先调用__sleep()
,返回一个包含所有变量名称的数组,如果该方法不返回任何内容,则null被序列化,并产生一个notice级别的错误。__wakeup()
方法和__sleep()
相反,在调用unserialize()
时被调用
__toString()
让一个类决定它如何转换成字符串,在php5.2.0之前,这个方法只能结合echo
或print
方法生效,php5.2.0之后,可以结合printf()
修饰,但修饰的时候也不能用类似%d之类的非字符修饰符。
__invoke()
当尝试以调用函数的方式调用对象时,将出发这个函数,只在php5.3之后生效。
__set_state()
静态方法,当调用var_export()
的时候,才会调用这个静态方法,php5.1.0之后生效。唯一参数是接收一个数组。
__construct() / __destruct()
构造函数和析构函数,构造函数主要用于类的初始化,析构函数在某个对象的所有引用都删除后或者对象被显示的销毁时运行。在析构函数中不允许抛出异常,否则会出发一个fatal error
,析构函数在脚本结束时调用,此时所有的http header都已经发出.
__clone()
对象复制,此方法不能直接被调用,必须通过clone
关键字显示调用