Php Yii2$型号->_属性分配在新版本中不起作用

Php Yii2$型号->_属性分配在新版本中不起作用,php,yii2,getter-setter,Php,Yii2,Getter Setter,我继承了一个用Yii2,ver创建的项目。2.0.4,由于旧版本与PHP7.2+不兼容,任务是将上述项目更新为更新版的Yii2(2.0.15) 我注意到将数组指定给模型有很多用途: $model->_attributes = $array; 对于新版本,这会导致异常 'yii\base\UnknownPropertyException' with message 'Setting unknown property: app\models\model::_attributes' 目前,我

我继承了一个用Yii2,ver创建的项目。2.0.4,由于旧版本与PHP7.2+不兼容,任务是将上述项目更新为更新版的Yii2(2.0.15)

我注意到将数组指定给模型有很多用途:

$model->_attributes = $array;
对于新版本,这会导致异常

'yii\base\UnknownPropertyException' with message 'Setting unknown property: app\models\model::_attributes'
目前,我使用以下功能创建了一个变通方法:

function customSetAttributes(&$model, $array) {
    foreach($model->attributeLabels() as $model_key => $model_label) {
        if(!isset($array[$model_key])) continue;
        $model->$model_key = $array[$model_key];
    }
}
另外,getter函数现在也有类似的问题

我想知道的是:

  • 这种类型的任务一开始就不是我们想要的(我只是没有找到以前开发人员的代码来支持它)?我浏览了Yii2变更日志,但没有注意到任何相关内容
  • 有没有办法“挽救”以前的行为,这样我就不必用我的变通功能替换每次发生的行为

ActiveRecord::$\u属性始终是私有的,不应以这种方式使用。我猜以前的开发人员在
vendor
目录中编辑了框架核心文件,并将此属性设置为protected/public

您可以尝试通过使用getter和setter创建虚拟属性来模拟此行为:

public function get_attributes() {
    return $this->getAttributes();
}

public function set_attributes($values) {
    $this->setAttributes($values, false);
}
但这并不总是有效的,它更像是一个丑陋的黑客让蹩脚的代码工作。我强烈建议修复代码以使用
setAttributes()
而不是
\u attributes


此外,您还应将
供应商
目录下的
yii2
软件包与源代码进行比较-您可能会发现更多编辑核心的地方。

即使在您指定的版本中,这也从未像上面那样使用过,它们是
应用程序/控制器
目录下的实际
控制器谢谢,到目前为止,我使用了setAttributes()和getAttributes()。