PHP为我们提供了一些魔术常量和魔术方法,学习它们,对于我们掌握更高级的PHP技巧是非常有用的。
1.魔术常量
PHP中的常量大部分是不变的,但是有8个常量,会随着它们所在的位置变化而变化,这8个常量被称为**魔术常量**,下面分别列出了这些常量:
* __CLASS__:指常量所指向类的名称。通常指类被定义时的名称,而不是类进行实例化的名称。
* __FILE__:指常量所指向文件的文件名称
* __LINE__:通常和__FILE__联合使用,用来输出所在代码中的位置行
* __DIR__:作用于函数dirname(__FILE__)比较类似,他返回的是文件所在位置的绝对目录。使用绝对路径比使用相对路径运行速度快很多,尤其是当文件中包含程序脚本的时候
* __FUNCTION__和__METHOD__:两用这两个魔术常量可以分别得到函数或方法的名称。情况允许的时候,应尽可能地在程序中使用这些魔术常量而不是对函数名称使用硬编码
* __NAMESPACE__:他等同于当前的命名空间。
* __TRAIT__: Trait的名字。在PHP5.4起,这个常量返回trait被定义时的名字(区分大小写)。Trait名包括其被声明的作用区域。
来看一个官网的例子。
class trick
{
function doit()
{
echo __FUNCTION__;
}
function doitagain()
{
echo __METHOD__;
}
}
$obj=new trick();
$obj->doit();
output will be ---- doit
$obj->doitagain();
output will be ----- trick::doitagain
通过上面的例子,可以看出FUNCTION和METHOD的不同之处,前者只返回了函数名称,而后者则 返回了一个跟在类名后的方法名称。
2.魔术方法
在PHP中,把以两个下划线__开头的方法称为魔术方法,所以我们在自定义方法的时候,建议不要使用__作为方法的前缀。这些方法在PHP的作用非常广泛,是我们在编写面向对象的代码中,必须掌握的。魔术方法包括:
__construct() 类的构造函数
__destruct() 类的析构函数
__call() 在对象中调用一个不可访问方法时调用
__callStatic() 用静态方式中调用一个不可访问方法时调用
__set() 设置一个类的成员变量时调用
__get() 获得一个类的成员变量时调用
__isset() 当对不可访问属性调用isset()或empty()时调用
__unset() 当对不可访问属性调用unset()时被调用
__sleep() 执行serialize()时,先会调用这个函数
__wakeup() 执行unserialize()时,先会调用这个函数
__toString() 类被当成字符串时的回应方法
__invoke() 调用函数的方式调用一个对象时的回应方法
__set_state() 调用var_export()导出类时,此静态方法会被调用
__clone() 当对象复制完成时调用
__debugInfo() 打印所需调试信息
下面先以__construct(),类的构造函数函数为例,说明魔术方法的作用机制:
PHP中构造放阿飞是**对象创建完成后**第一个被对象自动调用方法,在每个类中,都有一个构造方法, 如果没有显式的声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。
作用:通常被用来执行一些初始化的任务。
使用方法:
Class MyClass
{
function __construct([$params])
{
do something;
}
}
需要注意的是,在同一个类中,我们只能声明一个构造方法,原因是PHP不支持构造函数重载。
......先写到这里,上班了......