PHP __get和__set魔术方法-为什么我们在这里需要这些方法?

| 在http://framework.zend.com/manual/en/learning.quickstart.create-model.html的Zend快速入门指南上,我们可以看到:
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();
...
我通常在没有任何魔术方法的情况下创建我的getter和setter方法。我已经在快速指南中看到了这一点,但我不明白为什么我们需要这样做。 谁能帮我吗? 非常感谢     
已邀请:
您(通常)永远不会直接致电
__set
__get
。如果
bar
不可见并且
__get
存在,3ѭ将自动调用
$foo->__get(\'bar\')
。 在您链接的教程中,对getter和setter进行了设置,以自动调用相应的单个get / set函数。因此,
$foo->comment = \'bar\'
将间接称为
$foo->setComment(\'bar\')
。这不是必需的……只是一种方便。 在其他情况下,ѭ2可以用于创建看起来像只读变量的东西。     
如果您“创建自己的”获取器和设置器,则将为每个属性创建两个函数:
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;
 }
}
现在,我可以使用
$obj->comments
设置或获取评论。 为了在不使用重载的情况下实现上述功能,我不得不编写4种不同的方法。无论是在实际文件方面还是在为项目中的对象创建标准化接口方面,这实际上都是关于代码组织的。 我个人更喜欢照做,为需要复杂的getter / setter的每个属性编写单独的方法。对我来说,它的组织更加清晰,并且对象的“简单”属性与具有更大复杂性或一对多关系的那些属性之间存在明显的分隔。     
__get
__set
魔术方法的存在有两个原因: 这样您就不必花费时间为所有属性创建香草访问器方法。 允许您实现属性重载。 如果您的属性需要特殊处理,那么魔术方法不适合您。但是,如果您的属性仅包含数据且没有依赖关系,则没有理由不使用魔术方法。     
在本教程的进一步内容中,您可以修改
__get()
__set()
方法,以便您了解它们在那里的原因。 进行这样的魔术处理可以使您做一些整洁的事情,例如甚至设置“只读”属性,还可以防止您因一堆杂乱的getter / setter而使您的班级膨胀。     
使用ѭ1并想覆盖子类中的setter功能时,您会遇到问题。您将必须复制整个代码到ѭ1中,并且仅更改特定部分,而不仅仅是简单地覆盖一个特定的setter函数->冗余代码 可以通过在
__set
中调用特定的
setter
来避免此问题(感谢cHao提供小费)。 例:
class Foo1 {
   protected $normal;
   protected $special;

   public function setSpecial($special) {
      if ($special == isReallySpecial()) {
         $this->special = $special;
      }
   }

   public function __set($key, $value) {
      switch ($key) {
         case \'normal\':
            $this->normal = $value;
            break;
         case \'special\':
            $this->setSpecial($value);
      }
   }
}

class Foo2 extends Foo1 {
   public function setSpecial($special) {
      if ($special == isNotReallySpecial()) {
         $this->special = $special;
      }
   }
}
    

要回复问题请先登录注册