什么时候/我应该在PHP中使用__construct(),__ get(),__ set()和__call()?

Tho*_*ens 11 php magic-function

一个类似的问题讨论__construct,但我把它留在我的头衔,搜索谁找到这个.

显然,__ get和__set采用的参数是获取或设置的变量.但是,您必须知道变量名称(例如,知道该人的年龄是$ age而不是$ myAge).因此,如果您必须知道变量名称,我不明白这一点,特别是如果您正在使用您不熟悉的代码(例如库).

我发现一些网页解释__get(),__set()__call(),但我仍然不知道为什么,或者当它们是有用的.

小智 6

这个页面可能会有用.(注意你所说的不正确 - __set()将变量的名称和值作为参数.__get()只需要变量的名称).

__get()并且__set()在您希望提供对变量的泛型访问的库函数中很有用.例如,在ActiveRecord类中,您可能希望人们能够将数据库字段作为对象属性进行访问.例如,在Kohana PHP框架中,您可以使用:

$user = ORM::factory('user', 1);
$email = $user->email_address;
Run Code Online (Sandbox Code Playgroud)

这是通过使用__get()和完成的__set().

使用时可以完成类似的事情__call(),即您可以检测到有人在调用getProperty()和setProperty()并相应地处理.


Pet*_*ley 5

__get(),__ set()和__call()是PHP所谓的"魔术方法",这是一个绰号我觉得有点傻 - 我认为"钩子"更容易.无论如何,我离题了......

这些的目的是为访问在对象上定义的数据名称(属性或方法)提供执行案例,这可用于各种"聪明"的思考,如变量隐藏,消息转发等.

然而,有一个成本 - 调用它们的调用比定义的数据库调用慢大约10倍.

  • 你对它的速度有什么参考吗?不是说我不相信你(因为我这样做),但我希望不是. (5认同)