Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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中的对象引用?_Php_Arrays_Oop_Object_While Loop - Fatal编程技术网

如何将对象存储在数组中,而不是PHP中的对象引用?

如何将对象存储在数组中,而不是PHP中的对象引用?,php,arrays,oop,object,while-loop,Php,Arrays,Oop,Object,While Loop,我有一个循环,在其中存储一个对象,该对象已更新到数组中的下一个位置。PHP存储对对象的引用,而不是将对象存储在数组中。因此,在循环结束时,我的数组包含许多对对象最新版本的引用,所有引用都包含相同的信息。如何在循环的每次迭代中存储对象的实例 while( $Row = $Query->fetch_object() ) { $Company->id = $Row->id; $Company->json = json_decode($Row->json); $

我有一个循环,在其中存储一个对象,该对象已更新到数组中的下一个位置。PHP存储对对象的引用,而不是将对象存储在数组中。因此,在循环结束时,我的数组包含许多对对象最新版本的引用,所有引用都包含相同的信息。如何在循环的每次迭代中存储对象的实例

while( $Row = $Query->fetch_object() ) {
  $Company->id = $Row->id;
  $Company->json = json_decode($Row->json);
  $companies[] = $Company;
}

您可以在每次迭代中通过以下方式创建新对象:

  • 实例化一个新对象
    $newObj=newcompanyclass()
  • 克隆旧对象
    $newObj=clone$Company
  • 请记住,PHP执行对象所有属性的浅拷贝。任何引用其他变量的属性都将保留为引用

    while( $Row = $Query->fetch_object() ) {
      $newCompany = clone $Company; //or new CompanyClass();
      $newCompany->id = $Row->id;
      $newCompany->json = json_decode($Row->json);
      $companies[] = $newCompany;
    }
    

    尝试使用数组\u推送并在循环后返回它?
    Clone
    works。为什么会这样?我不敢相信我以前从未遇到过这个问题。当我直接将$Row从数据库存储到数组中时,它不存储对$Row的引用,而是存储对象。WTF?你指的确切问题是什么?PHP多年来都是这样工作的,关于这种行为及其原因的文章很多。如果它像你想象的那样工作,我们的记忆就会严重不足。。。我想我明白了。所以PHP识别出我的
    $Company
    对象在任何地方都是相同的,除非我实例化了它的一个新副本,在这一点上,PHP知道它是一个不同的对象,即使变量名是相同的?这是一种令人困惑的行为,我不敢相信我以前从未遇到过这种情况。这不是一种奇怪的行为,它在OOP语言中非常常见。在PHP中,对象作为引用传递,而原语作为值传递。这非常有意义。谢谢