首先是代码,然后是问题:
class MyArray
{
private $arrayRef;
function __construct(&$array){
$this->arrayRef = $array;
}
function addElement($newElement){
$this->arrayRef[] = $newElement;
}
function print(){
print_r($this->arrayRef);
}
}
$array = ['first', 'second'];
$arrayObject = new MyArray($array);
$arrayObject->addElement('third');
print_r($array); // prints array containing 2 elements
echo '<br/>';
$arrayObject->print(); // prints array containing 3 elements
Run Code Online (Sandbox Code Playgroud)
在此示例中,类成员 $arrayRef 不能用作对构造函数中提供的另一个数组的引用。构造函数中的参数是通过引用传递的,但我想这并不会使成员 $arrayRef 也成为对该数组的引用。
为什么它不能那样工作以及如何让它工作?
如果您仍然不明白我的意思:第一个 print_r 打印包含 2 个元素的数组,即使它可能预期包含 3 个。当我通过 addElement() 将第三个元素传递给 $arrayObject 时,我也希望将其添加到我传递给类的构造函数的 $array 。
答案其实很简单。是的,您通过引用传递数组&$array,但是当您将其分配/复制到成员变量时,该引用会丢失。要保留引用,您可以=&像这样使用运算符
$this->arrayRef =& $array;
Run Code Online (Sandbox Code Playgroud)
看看它在这个小提琴中的工作原理。您可以在这个问题/答案中阅读更多相关信息(只需查找参考)。
注意不要使用&=(按位运算)代替=&(按引用分配)。