2012-04-17 89 views
0

我想要做我的保護瓦爾的大規模assignement,我用這個代碼:PHP:大規模assignement

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。

上面的代碼適用於我,但我覺得它不乾淨。有沒有更好的解決方案來做到這一點?

thanx。

回答

2

代碼乾淨,沒什麼不好。在設置之前,你可能會另外看到class字段是否存在 - 所以你可以確保你沒有設置任何額外的字段,這些字段沒有在類中定義。

也使代碼短一點,你可以這樣做:

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

這是物質的味道,你喜歡什麼 - 你的變化是細微的好。

0

你在做什麼很好。我會添加一個支票的財產:

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

你的代碼是非常乾淨,因爲它得到的大規模分配。還有其他的選擇,比如使用array_walk()而不是foreach循環,但是我發現在這些情況下循環更清晰,更易於理解。

0

它看起來不錯給我,但如果$屬性始終是一個數組也許你應該添加是爲了避免錯誤

public function setAttributes($attributes=array()) 

做,如果屬性是空的,因爲初始化$您將不會收到一個錯誤屬性數組

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) { 

} 
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); 
    }