CakePHP模型实例混淆

CakePHP模型实例混淆,php,cakephp,model,Php,Cakephp,Model,在调试了一段时间后,我注意到CakePHP(2.x)模型使用中有一个非常奇怪的行为: 当我更改模型ID并在与同一模型有关系的完全不同的对象实例上使用read()时,它会覆盖旧模型数据 // set the user, by using the 'User' model $this->User->id = 1; $this->User->read(); print_r($this->User->data); // works correctly $insta

在调试了一段时间后,我注意到CakePHP(2.x)模型使用中有一个非常奇怪的行为:

当我更改模型ID并在与同一模型有关系的完全不同的对象实例上使用read()时,它会覆盖旧模型数据

// set the user, by using the 'User' model
$this->User->id = 1;
$this->User->read();

print_r($this->User->data); // works correctly

$instance = new Notification(); // this has a relation to the 'User' model

print_r($instance->User->data); // == $this->User->data! why?!

$instance->User->id = 2;
$instance->User->read();

print_r($this->User->data); // == $instance->User->data!
为什么这些模型相互关联?既然这是一个新的实例,它们不应该完全分开吗?我的意思是,我正在为通知设置“用户”模型,而不是为$this

如果这是默认行为,那么在不更改其他模型的情况下,如何将()数据读入不同的实例?我真的需要手动创建一个新的“用户”实例并将其存储在
$instance
中的某个位置以避免这种行为吗?这听起来很难看。

模型实例是单例的 问题中的以下两个对象是相同的:

$this->User
$instance->User
因为它们实际上是同一个对象,所以用于访问对象的路径不会修改(用户)对象本身的行为

这就是它的工作原理,当再次查询相同的别名(类名)时,它将返回相同的对象

不要使用“新建”创建模型 这样做是不正常的,而且可能会在将来引起问题或至少是混乱。要获取通知模型的引用,请根据需要使用或
ClassRegistry::init

不要使用Model::read 我真的需要手动创建一个新的“用户”实例吗

绝对不是,这不是模型使用CakePHP的目的。模型类实际上是数据库的接口,它不是一行的表示(调用save时除外)


避免大量问题的最简单方法是根本不使用,而是使用;一个更完整的代码示例可以提供更具体的答案。

谢谢,这确实为我澄清了一些问题。我现在不明白的是,为什么在cakePHP文档中,所有内容都使用单个模型行显示。我的意思是:如果您创建一个新的“行”——您在模型上使用
->create()
——并且在许多情况下,您也在模型上设置
->id
(至少在某些示例中是这样)。如果模型应该表示整个表而不是一行,那么这似乎是一个相当混乱的用法。所以我一直在猜测,$this->User是一个新的用户实例,而不是一个单例,因为$this->User->id是允许的。当调用save是一个特定的用例时,该调用的模型表示一个单独的行,但一般来说,该模型是一个返回数组的类,即数组(行,行2,行3)-“行表示”数据类型只是一个数组,而不是模型对象。