我有两个类。一个具有数组 (ArrayStorage
),另一个 (ArrayConsumer
) 仅具有一个变量,该变量将充当对数组的简单引用。
我使用 $my_array
将新元素添加到数组中。然后我检查新元素在 $obtained_array
中是否可见。但测试失败,因为它找不到新元素。它们的表现就像是不同的阵列。它们不应该指向同一个数组吗?
public function testArrayMadness() {
$arrayStorage = new ArrayStorage();
$my_array = $arrayStorage->getArray();
$arrayConsumer = new ArrayConsumer($my_array);
$obtained_array = $arrayConsumer->getArray();
$my_array[3]='c';
$this->assertContains('c', $obtained_array);
}
}
class ArrayStorage {
private $my_array=[1=>'a',2=>'b'];
function getArray() { return $this->my_array; }
}
class ArrayConsumer {
private $obtained_array;
function __construct($array) { $this->obtained_array=$array; }
function getArray() { return $this->obtained_array; }
}
更新: 我在 Java 中进行了同样的测试,它给了我一个 indexOutOfBoundsException。这是否意味着 php 和 java 在这方面的工作方式相同,还是我的代码有问题?
@Test
public void testArrayMadness() {
ArrayStorage arrayStorage = new ArrayStorage();
List<String> my_list = arrayStorage.getList();
ArrayConsumer arrayConsumer = new ArrayConsumer(my_list);
List<String> obtained_array = arrayConsumer.getList();
my_list.add("c");
assertEquals("c", obtained_array.get(3));
}
}
class ArrayStorage {
private List<String> my_list;
public ArrayStorage() {
my_list = new ArrayList<>();
my_list.add("a");
my_list.add("b");
}
public List<String> getList() { return my_list; }
}
class ArrayConsumer {
private List<String> obtained_list;
public ArrayConsumer(List<String> list) {
this.obtained_list = list;
}
public List<String> getList() { return this.obtained_list; }
}
最佳答案
PHP 数组不是对象,它们是按值分配的:
$a = [1,2,3];
$b = $a;
$b[2] = 99;
print_r($b); // 1,2,99
print_r($a); // 1,2,3
解决方法是使用引用符号 &
(通常是个坏主意)或 ArrayObject
:
$a = new ArrayObject([1,2,3]);
$b = $a;
$b[2] = 99;
print_r($b); // 1,2,99
print_r($a); // 1,2,99
关于java - 为什么我的变量不指向同一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27553846/