Yii中$ model->属性和$ model-> setAttributes()之间的差异

时间:2014-09-02 13:08:19

标签: php yii

每当我使用$model->attributes=$_POST['Users']时,它都会从用户表单中保存数据。

当我使用$model->setAttributes($_POST['Users'])时,它还会保存用户表单中的数据。

那么,任何人都可以澄清两个代码之间的区别吗?

5 个答案:

答案 0 :(得分:3)

使用$this->setAttributes()您可以使用{1}}来分配不安全的属性。

分配不安全的属性:

$this->attributes

更多信息:http://www.yiiframework.com/doc/api/1.1/CModel/#setAttributes-detail

答案 1 :(得分:2)

如Yii wiki所述,您可以使用其中任何一种。使用$model->attributes可以直接设置变量。使用$model->setAttributes(),您可以通过所谓的“setter方法”设置变量。

http://www.yiiframework.com/wiki/167/understanding-virtual-attributes-and-get-set-methods/#hh1

我会使用setter方法而不是直接调用变量,因为你可以在你的setter方法中添加一行,它将适用于它的所有调用,并且它可以避免你在将来遇到很多麻烦

示例:

class Model {
  public $attributes;

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

$model = new Model();
$model->setAttributes("Foo");
echo $model->getAttributes();
$model->setAttributes("Bar");
echo $model->getAttributes();

因此,现在如果您想对属性进行额外操作,可以将其添加到setAttributes()方法,而不是更改两行代码,您只能更改一行。

示例:

class Model {
  public $attributes;

  public function setAttributes($attributes) {
    $this->attributes = $attributes . "-Bar";
  }
  public function getAttributes() {
    return $this->attributes;
  }
}

$model = new Model();
$model->setAttributes("Foo");
echo $model->getAttributes();
$model->setAttributes("Bar");
echo $model->getAttributes();

现在将其扩展到一个水平,当更改数千行代码时不方便,而不是更改几个setter方法。

答案 2 :(得分:2)

绝对没有区别。

当您尝试在component上分配未定义为PHP类属性的属性(例如此处为attributes)时,Yii按约定调用类似命名的setter方法{{1相反。如果不存在此类方法,则抛出异常。由于Yii模型是一个组件而模型没有setAttributes属性,因此即使使用第一个表单也会调用setter方法。

手册中的所有内容也都是explained in detail

答案 3 :(得分:1)

$model->attributes=$_POST['Users']// means setting value of property directly while
$model->setAttributes($_POST['Users']) //is method or function which is indirectly set value of $model->attributes property;  

让我们举个例子

  class Model{
        public $attributes;


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

        }


  }

            //Now the value of $attributes can be set by two way


 $model = new Model();
 $model->attributes=$value; // 1st way
 $model->setAttributes($value); //2nd way

答案 4 :(得分:0)

没有区别。 array_merge用于合并属性,如果稍后设置