php:大规模的任务

时间:2012-04-17 18:41:53

标签: php

我想对受保护的变量进行大规模的分配,我使用了这段代码:

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)为exapmle。

上面的代码对我有用,但我觉得它不干净。有没有更好的解决方案呢?

感谢名单。

6 个答案:

答案 0 :(得分:2)

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

为了使代码更短,你可以这样做:

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

这是你喜欢的味道问题 - 你的变体也很好。

答案 1 :(得分:0)

你做得很好。我会为房产添加一张支票:

foreach($attributes as $key => $val)  
{
    $var = '_' . $key;
    if (property_exists($this, $var)) 
    {
        $this->$var = $val;  
    }
} 

答案 2 :(得分:0)

您的代码几乎与大规模分配一样干净。有一些替代方法,比如使用array_walk()而不是foreach循环,但我发现在这样的情况下,循环更清晰,更容易理解。

答案 3 :(得分:0)

它对我来说没问题,但是如果$ attributes总是一个数组,你应该添加它以避免错误

public function setAttributes($attributes=array())  

这样做,如果属性为空,则不会收到错误,因为初始化$ attributes数组

答案 4 :(得分:0)

您可以使用Magic Methods。将数组指定为属性值。并且每次调用变量如$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) {

}

答案 5 :(得分: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);
    }