PHP数组,总是通过引用

时间:2010-12-31 18:41:29

标签: php arrays reference

有没有办法创建一个总是通过引用处理而不必使用&运算符的PHP数组?

例如:

$a = array_by_ref('a', 'b', 'c');
$b = $a;
$b[] = 'd';

应导致$a$b等于:

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

2 个答案:

答案 0 :(得分:1)

如果SPL可用,则有ArrayObject类:

$a = new ArrayObject(array('a', 'b', 'c'));
$b = $a;
$b[] = 'd';

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

答案 1 :(得分:0)

ArrayObject不符合array_maparray_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"