【问题标题】:Automatically use getters and setters with PHP's __get and __set methods?使用 PHP 的 __get 和 __set 方法自动使用 getter 和 setter?
【发布时间】:2013-07-02 21:35:07
【问题描述】:

我正在尝试构建一个基类,我的所有类都从该基类扩展,允许通过简单的$obj->property 语法访问属性,但如果定义了get_property()set_property($value),那么任何获取或设置它的尝试属性通过这些 getter 和 setter 路由。

不过,棘手的部分是我希望对对象属性的更新反映在一个数组中(这是对象的一个​​属性,称为$changed_array),它可以输出一个已更改属性的数组,出于某种目的,例如插入到数据库更新调用中。

问题出在这个示例中:

class Sample {
     private $changed_array;

     public __get($var_ame){
         if(method_exists($this, $method = 'get_' . $var_name)){
             return $this->$method();
         } else {
             return $this->$var_name;
         }
     }

     public __set($var_name, $value){
         if(method_exists($this, $method = 'set_' . $var_name))}
             return $this->$method($value);
         } else {
             // pseudo code
             if($this->$var_name isset and isn't $value) { // add to $changed_array }
             return $this->$var_name = $value;
         }
     }
}

这很好用,直到有一个像这样定义的 setter 方法:

public set_var_name($value){
    // pretend we're mapping a db column to another name
    $this->other_var_name = $value;
}

这样,setter 被调用,但它设置的属性是可访问的,所以新值不使用 __set__get 函数,并且更改后的数组不会使用 other_var_name 更新为更改属性。

除了使用 $this->set('variable', 'value') 之类的东西来达到结果之外,是否有某种 hack?我只会写 getter 和 setter,但它们会根据 db 模式而有所不同,如果有一个优雅简单的解决方案,那就太好了。

【问题讨论】:

  • 如果你想通过你的魔法方法来路由一切,为什么要定义一个公共的 setter?
  • 用于重新映射属性之类的事情。例如,如果属性token 变为private_key,您可以只将get_private_key()set_private_key($value) 函数映射到$this->token,直到可以迁移数据库。
  • @zerocrates Setter 将进行变量内容处理,例如如果您有浮点值,并且在内部表示中您希望它在浮点后精确地格式化为 4 位。
  • 我理解为什么你可能想要设置器,但如果关键是通过__set() 运行所有内容以便它可以填充更改日志,那么为什么不将设置器设为 private i> 并强制消费者使用$obj->private_key = 'foo',因为您已经有一个__set(),在这种情况下会调用set_private_key
  • 在每个 setter 上使用 $this->__set(name, value) 似乎是最简单的方法。它还将允许以菊花链形式连接映射(如果存在)。

标签: php


【解决方案1】:

试试这个,

$objects = array("model", "make", "version");
          foreach ($objects as $object) {
              $getter = "get".ucfirst($object);
              if (is_object($iProduct->$getter())) {
                  echo "getvalue"+$iProduct->$getter()
          }

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 2012-04-05
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多