0

我想对受保护的变量进行大量分配,我使用了以下代码:

protected $_productName = '';
protected $_price = 0;
protected $_categoyId = 0;  
 public function setAttributes($attributes)  
 {  
  foreach($attributes as $key => $val)  
  {
    $var = '_' . $key;
    $this->$var = $val;  
  }  
 }

$attributes = array('productName'=>'some Product', 'price' => 10, 'categoryId' => 5)例如。

上面的代码对我有用,但我觉得它不干净。有没有更好的解决方案来做到这一点?

谢谢。

4

6 回答 6

2

代码很干净,没什么不好的。您可能还可以在设置之前查看类字段是否存在 - 因此您可以确保没有设置任何未在类中定义的其他字段。

另外为了使代码更短一点,你可以这样做:

$this->{"_{$key}"} = $val;

这是你喜欢什么口味的问题——你的变种也很好。

于 2012-04-17T18:47:38.713 回答
0

it looks ok to me, but if $attributes is always an array probably you should add this to avoid errors

public function setAttributes($attributes=array())  

doing that you won't receive a error if attributes is empty because initialize the $attributes array

于 2012-04-17T18:51:08.623 回答
0

我不久前还使用了类似以下代码的代码作为测试:

    private $data = array();

    public function __get($name)
    {
        if (array_key_exists($name, $this->data))
        {
            return $this->data[$name];
        }
    }

    public function __set($name, $value)
    {
        $this->data[trim($name)] = trim($value);
    }
于 2012-04-17T18:53:48.783 回答
0

你在做什么很好。我会为该属性添加一个检查:

foreach($attributes as $key => $val)  
{
    $var = '_' . $key;
    if (property_exists($this, $var)) 
    {
        $this->$var = $val;  
    }
} 
于 2012-04-17T18:49:14.157 回答
0

您的代码几乎与批量分配一样干净。还有其他选择,比如使用array_walk()代替foreach循环,但我发现循环在这种情况下更简洁,更容易快速理解。

于 2012-04-17T18:49:26.723 回答
0

您可以使用魔术方法。将数组分配为属性值。并且每次你调用像$this->var调用__get方法这样的变量

public function setAttributes($attributes)  
{  
   $this->attributes = $attributes;
}

function __get($var) {
  if(isset($this->attributes[$var])) return $this->attributes[$var];
  return false;
}

function __set($key, $var) {

}
于 2012-04-17T18:52:55.530 回答