魔术方法
魔术方法与普通方法相比具有很大的不同,普通方法是根据用户的实现方式进行调用,而魔术方法通常情况下用户不会主动调用,而是在特定的时机被PHP系统自动调用,可以通俗的理解为事件监听,PHP系统监听到事件发生时才执行这些方法。在PHP中通常以 “ __ ” 双下划线打头的方法作为魔术方法,所以用户不要定义以双下划线开头的方法。
对于魔术方法的使用需要了解两个方面的内容:
一、魔术函数定义的位置
二、魔术函数调用的时机
下面表格中所示PHP中常用的魔术方法的使用方法
方法名称 | 使用方法 |
---|---|
__construct() | 构造函数会在每次实例化对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作 |
__destruct() | 析构函数会在某个对象的所有引用都被删除或者当对象被显式销毁时执行 |
__set() | 用于属性重载,在给不可访问的属性赋值时,__set() 会被调用 |
__get() | 读取不可访问属性的值时,__get()会被调用 |
__isset() | 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用 |
__unset() | 当对不可访问属性调用 unset() 时,__unset() 会被调用 |
__sleep() | serialize() 检查类中是否有魔法方法 __sleep()。 如果存在,该函数将在任何序列化之前运行。它可以清除对象并返回一个包含有该对象中应被序列化的所有变量名的数组 |
__wakeup() | 相反地,unserialize() 检查是否具有魔术方法 __wakeup()。 如果存在,此函数可以用于重建对象 |
__toString() | 用于一个类被当成字符串时应该怎样回应。例如: echo $object; 语句执行时,该方法会被调用 |
__invoke() | 当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。例如: $object() 语句执行时,该方法会被调用 |
__clone() | 如果定义了 __clone() 魔术方法,则新创建对象(复制生成对象)时, __clone() 方法会被调用,可用于修改属性的值 |
__call() | 在对象中调用一个不可访问的方法时,__call() 会被自动调用 |
__callStatic() | 在静态方式中调用一个不可访问的方法时,__callStatic() 会被调用 |
__autoload() | 它会在试图使用尚未被定义的类时自动调用 |
魔术常量
PHP 向它运行的任何脚本提供了很多预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。同时,PHP 也在运行环境中提供了八个魔术常量,它们虽然被称为魔术常量,但是它们的值随着代码中的位置改变而改变。例如: __LINE__ 的值就依赖于它在脚本中所处的行来决定。
下面表格中所示PHP中常用的魔术常量的使用方法
常量名称 | 使用方法 |
---|---|
__LINE__ | 文件中的当前行 |
__FILE__ | 当前文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP4.0.2 起, __FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径 |
__DIR__ | 当前文件所在的目录。如果用在被包含文件中,则返回被包含的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠 |
__FUNCTION__ | 函数名称 (PHP4.3.0新加的魔术常量)。自 PHP5 起该常量返回该函数被定义时的名字并区分大小写。在 PHP4 中该值总是小写字母 |
__CLASS__ | 类的名称 (PHP4.3.0新加的魔术常量)。自 PHP5 起该常量返回该类被定义时的名字并区分大小写。在 PHP4 中该值总是小写字母。类名包括其被声明的命名空间 (如 Foo\Bar)。注意自 PHP5.4 起,__CLASS__ 对 trait 也起作用。当用在 trait 方法中时, __CLASS__ 是指调用 trait 方法的类的名字 |
__TRAIT__ | trait 的名字(PHP5.4.0新加的魔术常量)。自 PHP5.4 起,此常量返回 trait 被定义时的名字并区分大小写,trait 名包括其被声明的命名空间 (如 Foo\TraitBar) |
__METHOD__ | 类的方法名 (PHP5.0.0新加的魔术常量)。返回该方法被定义时的名字并区分大小写 |
__NAMESPACE__ | 返回当前命名空间的名称并区分大小写 (PHP5.3.0新加的魔术常量) |