Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 由于构造函数的原因,Yii模型isNewRecord为false_Php_Mysql_Activerecord_Yii - Fatal编程技术网

Php 由于构造函数的原因,Yii模型isNewRecord为false

Php 由于构造函数的原因,Yii模型isNewRecord为false,php,mysql,activerecord,yii,Php,Mysql,Activerecord,Yii,在Yii ActiveRecord中,是否可以在模型构造函数中设置一个属性,并且仍然保持模型的isNewRecord属性为true 我有一个模型构造函数来创建一个私有属性来保存PHPPass密码哈希实例。当我这样做时,它会将isNewRecord属性设置为false,即使记录是新创建的 如果id属性大于零,我尝试了在构造函数中调用setIsNewRecord(true)的变通方法,但在构造函数中属性似乎不可用 我必须删除构造函数,并在每个需要phpass的方法中生成语句 用户模型的构造函数: p

在Yii ActiveRecord中,是否可以在模型构造函数中设置一个属性,并且仍然保持模型的isNewRecord属性为true

我有一个模型构造函数来创建一个私有属性来保存PHPPass密码哈希实例。当我这样做时,它会将isNewRecord属性设置为false,即使记录是新创建的

如果id属性大于零,我尝试了在构造函数中调用setIsNewRecord(true)的变通方法,但在构造函数中属性似乎不可用

我必须删除构造函数,并在每个需要phpass的方法中生成语句

用户模型的构造函数:

public function __construct(){
    $this->phpass=new PasswordHash(Yii::app()->params['phpass']['iteration_count_log2'], Yii::app()->params['phpass']['portable_hashes']);
}
控制器中的用户模型init和isNewRecord条件

public function actionEdit($id = null)
{

    $myModel = new User();       
    echo $myModel->isNewRecord;   //false due to constructor
}

验证contstructor时,请确保调用父构造函数。验证时始终调用父构造函数,除非您知道自己在做什么

public function __construct($scenario = 'insert'){
    parent::__construct($scenario);
    $this->phpass=new PasswordHash(Yii::app()->params['phpass']['iteration_count_log2'], Yii::app()->params['phpass']['portable_hashes']);
}
此外,phpass可以存储为静态属性,您不需要为每个活动记录实例创建phpass的新实例

编辑:感谢@Kevin提供有关OVERding构造函数的链接


还有一个重要的要添加的注释:记住将参数传递给构造函数。在Yii模型类中,存在带有默认值的
$scenario
参数
insert
。当您在不传递此参数的情况下验证构造函数时,将始终出现
insert
场景,并且不会出现任何关于缺少参数的错误消息,因为它具有默认值。我用
$scenario
更新了代码。通常,您应该避免在Yii类中重写构造函数。大多数组件都提供了一个方法,而这个方法正是您示例中代码的正确位置


区别在于,对于应用程序组件,对象将已经应用了所有配置。这与您的情况无关,但使用
init()
而不是
\uu construct()

是一种很好的做法。您可以展示您尝试的解决方法吗?作为此答案的扩展,您可能希望查看以下问题的公认答案。它定义了调用parent::uu contstruct()的选项,以及何时应该在代码之前、之后调用它,或者完全不调用它。