我想对受保护的变量进行大规模的分配,我使用了这段代码:
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。
上面的代码对我有用,但我觉得它不干净。有没有更好的解决方案呢?
感谢名单。
答案 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);
}