一个类似的问题讨论__construct
,但我把它留在我的头衔,搜索谁找到这个.
显然,__ get和__set采用的参数是获取或设置的变量.但是,您必须知道变量名称(例如,知道该人的年龄是$ age而不是$ myAge).因此,如果您必须知道变量名称,我不明白这一点,特别是如果您正在使用您不熟悉的代码(例如库).
我发现一些网页解释__get()
,__set()
和__call()
,但我仍然不知道为什么,或者当它们是有用的.
这个页面可能会有用.(注意你所说的不正确 - __set()
将变量的名称和值作为参数.__get()
只需要变量的名称).
__get()
并且__set()
在您希望提供对变量的泛型访问的库函数中很有用.例如,在ActiveRecord类中,您可能希望人们能够将数据库字段作为对象属性进行访问.例如,在Kohana PHP框架中,您可以使用:
$user = ORM::factory('user', 1); $email = $user->email_address;
这是通过使用__get()
和完成的__set()
.
使用时可以完成类似的事情__call()
,即您可以检测到有人在调用getProperty()和setProperty()并相应地处理.
__get(),__ set()和__call()是PHP所谓的"魔术方法",这是一个绰号我觉得有点傻 - 我认为"钩子"更容易.无论如何,我离题了......
这些的目的是为访问未在对象上定义的数据名称(属性或方法)提供执行案例,这可用于各种"聪明"的思考,如变量隐藏,消息转发等.
然而,有一个成本 - 调用它们的调用比定义的数据库调用慢大约10倍.