PHP5.3新魔法__invoke概述

PHP已经加入一个神奇的方法称为__invoke自5.3版的,用这个方法调用后直接创建对象实例,如下面的示例所示:


TestClass类
{
公共功能__invoke
{
打印Hello World;
}
}
N =新的试验等级;
(n美元);




执行的结果如下:


你好世界。




PHP官方示例如下:




类callableclass
{
公共功能__invoke(X元)
{
var_dump(X元);
}
}
$ obj =新CallableClass;
为目标(5);
var_dump(is_callable($ obj));



附录:PHP其他魔法方法:

在PHP中的类可以使用魔法的方法。两规定下划线(__)在一开始的方法是保留给神奇的方法,建议您不要在__开始最好的函数名称,除非是有魔力的方法重载。

函数名__construct,__destruct,__call,__callstatic,__get,__set,__isset,__unset,__sleep,__wakeup,__tostring,__invoke,__set_state and__clone PHP类魔法。除非您希望与它们相关的神奇功能,否则不能在这些类中拥有这些名称的函数。

以下两种方法是为类中未声明的属性及其父类而设计的。

当__get(美元财产)调用一个未定义的属性,这种方法是引发和传递的参数是访问属性名称。

当__set(美元财产价值)分配一个未定义的属性,这种方法是引发和传递的参数是设置的属性的名称和值。

这里没有声明包含了访问控制和保护财产,私人(即物业没有权限访问)当使用对象调用。

同为__get法和__set方法,没有申报,包括访问控制保护和私有属性(即没有权限访问属性)对象时,调用。

方法不在此定义不包括访问;如果方法不存在这种方法找到的父类,如果父母没有给__call()方法,如果类不在__call存在(__call)在父类中找方法(方法)。

的__autoload功能,将自动调用当试图使用一个类没有定义。通过调用这个函数,脚本引擎已在PHP无法加载所需的类的最后机会。

注:抛出的异常在__autoload函数不能用catch语句块捕获并导致一个致命的错误,所以应该抓住在函数本身。

__construct施工方法,这种方法被称为一个对象被创建时,PHP4相对于该算法的优点是:可以使一个名字的施工方法是唯一的,不管它是什么类的名字。所以你在名称改变的时候,要改变施工方法。

__destruct析构函数的方法,PHP将销毁对象前,调用这个方法,才能从内存中删除。默认情况下,PHP只是释放由对象属性占用和破坏的对象相关的资源。析构函数允许您在使用一个对象后执行任何代码来清除内存。当PHP决定您的脚本不再与对象相关时,析构函数将被调用。

在函数的命名空间中,这发生在函数返回的时候。对于全局变量,这发生在脚本的结尾。如果要显式地销毁对象,可以将任何其他值赋给指向该对象的变量。通常分配变量为空或打电话取消。

PHP5的对象分配是参考分配使用,如果你想复制一个对象,你需要使用克隆的方法,这种方法是在调用对象会自动调用__clone方法如果复制对象魔术,需要执行一些初始化的操作,可以在__clone方法实现。

的__tostring方法是当一个对象被自动转换成一个字符串,例如当一个回声是用来打印对象。

之前的__tostring php5.2.0,方法只能当它是结合回波的使用()或()打印后,它可以在任何php5.2.0,环境有效的字符串(例如,通过使用printf(),使用%s改性剂),但它不能用于非字符串的环境,如%d修饰符。从php5.2.0,如果未定义的__tostring方法的对象转换为字符串,一个e_recoverable_error错误将报告。

__wakeup反序列化时调用。

serialize()检查类有一个神奇的名字__sleep.if函数,函数将运行在任何序列化。它可以清除对象,应该返回一个数组包含所有变量的名称要序列化的对象。

使用__sleep的目的是关闭的对象可能有数据库连接,在等待提交的数据,或做类似的清除任务。此外,如果有一个非常大的对象,不必完全存储也是有用的功能。

PHP相反,序列化()检查一个函数的存在性与神奇的名字__wakeup.if有一个功能,这个功能可以重建任何资源,可能有物体,使用__wakeup的目的是重建,可能会失去在序列化和处理其他任何数据库连接初始化任务。

当试图调用的方式,调用一个函数对象,该__invoke方法称为自动。

这在某种程度上类似于__call作品()魔术的方法,和__callstatic()是用来处理静态方法的调用。

PHP并加强对__callstatic定义()方法;它必须是公共的,必须声明为静态的。同样,在__call魔法()方法必须定义为public,和所有其他神奇的方法必须相同。