【问题标题】:Why is array_filter returning a reference?为什么 array_filter 返回一个引用?
【发布时间】:2022-11-16 21:11:30
【问题描述】:

我想了解这两者之间的区别($bookingRows 是具有不同属性的对象数组)。

$vehicleRows = [];
foreach($bookingRows as $row) {
 if($row->GroupCode == 'F') {
   $vehicleRows[] = clone $row;
 }
}

$vehicleRows = array_values(
 array_filter($bookingRows, function ($row) {
   return $row->GroupCode == 'F';
 })
);

我的问题是,如果我修改 $vehicleRows 数组中的某些内容,它也会在原点 $bookingRows 中反映这些更改——这不是我想要的。我怎样才能避免源和过滤后的项目集之间出现这种不需要的引用?

【问题讨论】:

  • 对象是总是通过引用传递。在第一个块中,您使用 clone 获取对象的新副本。 array_filter 版本不克隆任何东西。

标签: php array-filter


【解决方案1】:

为什么你的代码使用clone?因为否则它会产生与 array_filter() 相同的结果。

array_filter() 不是这里的罪魁祸首,PHP 对象是通过句柄操作的。该句柄在分配时被复制,这就是 array_filter() 所做的。除非使用 clone 显式复制对象,否则不会复制这些对象。

PHP documentation page about objects 提到了这种行为:

PHP 以与引用或句柄相同的方式对待对象,这意味着每个变量都包含一个对象引用而不是整个对象的副本。见Objects and References

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2014-04-13
    相关资源
    最近更新 更多