Нелогичная подмена значений переменной

Рейтинг: 0Ответов: 1Опубликовано: 12.01.2015

Всю голову сломал, не понимаю, как так происходит. PHP 5.4 Yii 1.1.15

Есть вот такой контроллер:

class MyController extends CController {
    private $_modelUser;

    // для простоты понимания, перенёс это сюда
    public function test() {
        $modelTest = UserModule::user();
        $modelTest->profile->attributes = ['firstname'=>'gon']; // для проверки
    }

    public function loadUser($id = null) {
        if ($this->_modelUser === null) {
            $this->_modelUser = UserModule::user($id);
        }
        return $this->_modelUser;
    }
    public function actionEdit() {
        $model = $this->loadUser();

        $this->render('edit', [
            'model'   => $model,
            'profile' => $model->profile
        ]);
    }
}

В UserModule::user вытягиваются связанные таблицы user и profile вот так:

public static function user($id = null) {
        //...
        if (!self::$_user) {
            self::$_user = User::model()->with('profile')->findbyPk(Yii::app()->user->id);
        }
        return self::$_user;
    }

Как видно, я гружу данные пользователя и передаю в представление, а в представлении делаю вот так:

var_dump($profile->attributes);
$this->test();
var_dump($profile->attributes);

и получаю

array(2) { ["id"]=> string(1) "1" ["firstname"]=> string(5) "Admin"}
array(2) { ["id"]=> string(1) "1" ["firstname"]=> string(3) "gon"}

Вопрос: каким образом меняется переменная $profile? Нигде ничего по ссылке не передаю. Не могу понять, как вообще она постфактум меняется без моего ведома.

Ответы

▲ 1Принят

У Вас статическое свойство self::$_user, которое хранит состояние модели User, т.е. при каждом обращении UserModule::user(), возвращается один и тот же объект. Исправьте это, либо клонируйте $profile:

$newProfile = clone $profile;