PHP返回对其他类中数组的引用

PHP返回对其他类中数组的引用,php,arrays,Php,Arrays,我有一个包含以下内容的类: class TestClass { protected $items = []; public function toArray(){ return $this->items; } // Items gets set using set(array $items){} } 在另一类中,我称之为: $tmpList = $list->toArray(); 现在如果我没有弄错的话,这将创建一个全新的单独数

我有一个包含以下内容的类:

class TestClass {
    protected $items = [];

    public function toArray(){
        return $this->items;
    }

    // Items gets set using set(array $items){}
}
在另一类中,我称之为:

$tmpList = $list->toArray();
现在如果我没有弄错的话,这将创建一个全新的单独数组,因此如果
TestClass
中的数组有100k个项,那么调用
toArray()
将为两个数组创建另一个数组,其中包含另外100k个项,总计200k个项

有没有一种方法可以让我只返回对
TestClass
中项目的引用,这样我就有一个包含100k个项目的数组,而
$tmpList
只引用这些项目

如果我对数组进行排序,数组不会改变

$tmpList = $list->toArray();
usort($tmpList, function($a, $b) use ($orderBy, $direction){
    if($direction == 'desc'){
        return $b->$orderBy > $a->$orderBy;
    }elseif($direction == 'asc'){
        return $b->$orderBy < $a->$orderBy;
    }
});

数组将被排序。

否,它不会复制整个数组的内容。数组中的项将通过引用进行处理。PHP将在幕后对此进行优化。PHP不是C。它没有与C相同的引用(指向内存位置的指针)。您不必担心如何优化它

$tmpList = &$list->toArray();
尽管您应该测试实际的性能影响,因为PHP使用引用的行为出乎意料

更新:实际上,您似乎还必须在函数声明前面添加(&F)。这部分搞错了

public function &toArray(){ ... }

这在PHP中意味着与“内存优化”非常不同的东西。除非您想允许两个单独的作用域操作相同的值,否则不要使用此选项。我制作了一个函数
protectedfunction&arrayRef(){return$this->items;}
这基本上做了相同的事情,但将其作为引用返回,并使用了您的赋值方法。@GetOffMyLawn当您得到意外的副作用时,请不要向我抱怨,但内存消耗没有实际差异…@deceze意外的低性能,是的。我去过那里。当然,在使用引用时,您必须一如既往地小心。但是意外的副作用呢?从未经历过这些。有什么特别的吗?@Torge当从函数返回数组时,您通常希望没有引用。这很容易导致代码在类外操纵数组,并意外地更改类内的数组。副作用排序应该简单地在类内完成,而不是在类内完成。从中我们可以看到“数组赋值总是涉及值复制。使用引用运算符通过引用复制数组。”@Luc。这与内存管理无关。@deceze我不认为这是真的。。。我有一个函数可以对数组进行排序,如果我调用
toArray()
,然后在数组上调用
usort
,它就不会被排序。但是,如果我做同样的事情,那么替换原始数组,它会被排序。数组中的对象引用会与数组一起复制。对数组顺序的任何更改都不会影响原始数组。数组中任何对象的更改都将反映在原始数组中。但是,对数组副本中的引用所做的任何更改都不会反映在原始数组中。@GetOffMyLawn如果您想要一个在操作时也会操作原点的引用,请使用my aproach在命令中输入一个&。但如果您“只”关心性能和数据复制,那么deceze是正确的。数据只会按需复制,这通常比非常缓慢的PHP引用实现要快。
public function &toArray(){ ... }