有没有办法创建一个总是通过引用处理而不必使用&
运算符的PHP数组?
例如:
$a = array_by_ref('a', 'b', 'c');
$b = $a;
$b[] = 'd';
应导致$a
和$b
等于:
('a', 'b', 'c', 'd')
答案 0 :(得分:1)
如果SPL可用,则有ArrayObject
类:
$a = new ArrayObject(array('a', 'b', 'c'));
$b = $a;
$b[] = 'd';
这些仍然是包装对象;要获得它们的原始数组等价物,您必须使用对象的getArrayCopy()
方法。还要记住,它可能非常慢,特别是当你遍历其元素时。
答案 1 :(得分:0)
ArrayObject
不符合array_map
,array_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"