PHP数组,始终通过引用

PHP数组,始终通过引用,php,arrays,reference,Php,Arrays,Reference,有没有一种方法可以创建一个PHP数组,它总是通过引用来处理,而不必使用&操作符 例如: $a = array_by_ref('a', 'b', 'c'); $b = $a; $b[] = 'd'; 应导致$a和$b均等于: ('a', 'b', 'c', 'd') 如果SPL可用,则有以下类别: 这些仍然是包装器对象;要获得它们的基本数组等价物,必须使用对象的getArrayCopy()方法。还请记住,它可能非常慢,尤其是当您遍历它的元素时。ArrayObject与array\u map、a

有没有一种方法可以创建一个PHP数组,它总是通过引用来处理,而不必使用
&
操作符

例如:

$a = array_by_ref('a', 'b', 'c');
$b = $a;
$b[] = 'd';
应导致
$a
$b
均等于:

('a', 'b', 'c', 'd')

如果SPL可用,则有以下类别:


这些仍然是包装器对象;要获得它们的基本数组等价物,必须使用对象的
getArrayCopy()
方法。还请记住,它可能非常慢,尤其是当您遍历它的元素时。

ArrayObject
array\u map
array\u reduce
以及期望使用真实数组作为输入的类似函数不匹配。如果要通过引用复制对象的数组属性,请使用任何类型的对象对其进行包装:

class Test
{
    private $array;

    public function __construct()
    {
        $this->array = (object) ['array' => []];
    }

    // we also need to return it by reference
    public function &getMyArray()
    {
        return $this->array->array;
    }
}
示例用法:

$test = new Test();
$test->getMyArray()[] = 'Hello';
$another = clone $test;
$another->getMyArray()[] = 'Fucking';
$third = clone $another;
$third->getMyArray()[] = 'World!';
unset($test->getMyArray()[1]);

var_dump($test->getMyArray() === $third->getMyArray());
var_dump(implode(" ", $test->getMyArray()));
var_dump(gettype($test->getMyArray()));
样本输出:

bool(true)
string(12) "Hello World!"
string(5) "array"

使用&symbol需要更少的键入:)就我个人而言,我建议不要做任何事情来回避&operator的使用,主要是为了代码的可读性。使用&可以清楚地表明您正在处理引用。删除它(使用任何方法)可能会给阅读您的代码的其他人造成混乱(甚至有时是您自己,因为从编写到重读都有很长的时间……当然,这在我身上从来没有发生过;))我认为
ArrayObject::getArrayCopy()
可能比强制转换更可取。@Mchl:谢谢您抓住了这一点。
bool(true)
string(12) "Hello World!"
string(5) "array"