2014-09-02 4 views
2

Всякий раз, когда я использую $model->attributes=$_POST['Users'], он сохраняет данные из формы пользователя.

Когда я использую $model->setAttributes($_POST['Users']), он также сохраняет данные из формы пользователя.

Так что, пожалуйста, кто-нибудь может пояснить разницу между двумя кодами?

+0

Я просто догадываюсь, но 'setAttributes()' также должен запускать некоторые правила проверки. – Narf

ответ

1

Как указано в вики Yii, вы можете использовать любой из них. С $model->attributes вы устанавливаете переменную напрямую. С помощью $model->setAttributes() вы устанавливаете переменную через так называемый «метод setter».

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

Я хотел бы использовать метод установки вместо прямого вызова переменной, как вы можете добавить строку в методе сеттер, и она будет применяться ко всем его звонки, и она спасет вас от много головной боли в будущем.

Пример:

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

Теперь масштабироваться это до уровня, когда это было бы неудобно менять тысячи строк кода, вместо того чтобы изменить пару сеттеров.

2

Нет абсолютно никакой разницы.

При попытке присвоить свойство, которое не определено как PHP класса собственности (например, attributes здесь) на component, Yii по соглашению называет аналогичным названием метод сеттер setAttributes вместо этого. Если такой метод не существует, генерируется исключение. Поскольку модель Yii является компонентом, а модели не имеют свойства attributes, метод setter вызывается даже при использовании первой формы.

Все это также explained in detail в руководстве.

+1

Пожалуйста, включите необходимые части ссылок в свой ответ, поскольку ссылки, как известно, мертвы в течение определенного периода времени. –

+0

@CaffeineCoder: Я думаю, что я уже сделал. – Jon

+0

Я имел в виду примеры, упомянутые здесь. –

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 
+1

Этот пример является абсолютно неправильным и пропускает точку. Модели Yii наследуют код, который заставляет их работать по-другому. Не существует свойства '$ attributes'. – Jon

+0

Это не Yii. Его общая концепция OPP PHP и пример - это не Yii-код, его единственный общий пример – Vicky

+1

Но вопрос в частности касается Yii, поэтому это не подходит. – Jon

3

С $this->setAttributes() вы можете назначить небезопасных атрибутов, с помощью $this->attributes вы не можете.

Назначения небезопасных атрибутов:

$this->setAttributes($_POST['Model'], false); 

Подробнее в: http://www.yiiframework.com/doc/api/1.1/CModel/#setAttributes-detail

+0

Я доволен вашим ответом @Marcos. –

0

Там нет никакой разницы. array_merge используется для объединения атрибутов, если установлено позже

Смежные вопросы