MEM*_*MEM 7 php zend-framework magic-methods
在Zend快速入门指南http://framework.zend.com/manual/en/learning.quickstart.create-model.html上我们可以看到:
class Application_Model_Guestbook
{
protected $_comment;
protected $_created;
protected $_email;
protected $_id;
public function __set($name, $value);
public function __get($name);
public function setComment($text);
public function getComment();
...
Run Code Online (Sandbox Code Playgroud)
我通常在没有任何魔术方法的情况下创建我的getter和setter.我在快速指南上看过这个,我不明白为什么我们需要这个.
谁能帮我吗?
非常感谢
Mat*_*hew 10
你(通常)从不打电话__set或__get直接打电话.如果不可见且存在,$foo->bar将$foo->__get('bar')自动调用.bar__get
在您链接到的教程中,getter和setter设置为自动调用相应的单个get/set函数.所以$foo->comment = 'bar'会间接打电话$foo->setComment('bar').这不是必要的......这只是一种便利.
在其他情况下,__get创建看似只读变量的内容会很有用.
如果你"制作自己的"getter和setter,你将为每个属性制作两个函数:getPropname()和setPropname.通过使用PHP的"魔术方法"setter/getter,您不会为每个属性编写单独的方法.您可以设置/获取属性,就像它们是公共的一样.在重载函数中,您可以添加特定于每个属性的逻辑.例:
public function __set($name, $value) {
switch ($name) {
case 'comments':
// do stuff to set comments
break;
case 'parent_user':
// do stuff to set parent user
break;
}
}
public function __get($name) {
switch ($name) {
case 'comments':
// do stuff to get comments
break;
case 'parent_user':
// do stuff to get parent user
break;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以使用$obj->commentsset或get 来访问注释.
为了在不使用重载的情况下实现上述功能,我不得不编写4种不同的方法.这实际上更多地是关于代码组织,无论是在实际文件方面还是在为项目内的对象创建标准化接口方面.
我个人更喜欢像你一样做,并为每个属性编写单独的方法,我需要一个复杂的getter/setter.对我来说,它组织得更清晰,并且对象的"简单"属性与具有更大复杂性或一对多关系的属性之间存在明显的分离.