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

マジックメソッドを使用できます。配列をプロパティ値として割り当てます。$this->varそして、 invoke__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 に答える
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

私には問題ないように見えますが、$ attributesが常に配列である場合は、エラーを回避するためにこれを追加する必要があります。

public function setAttributes($attributes=array())  

これを行うと、$ attributes配列を初期化するため、属性が空の場合でもエラーは発生しません。

于 2012-04-17T18:51:08.623 に答える