我有两节课。具有数组(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; }
}
答案 0 :(得分:5)
PHP数组不是对象,它们是按值分配的:
$a = [1,2,3];
$b = $a;
$b[2] = 99;
print_r($b); // 1,2,99
print_r($a); // 1,2,3
解决方法是使用引用标记&
(通常是个坏主意)或ArrayObject
s:
$a = new ArrayObject([1,2,3]);
$b = $a;
$b[2] = 99;
print_r($b); // 1,2,99
print_r($a); // 1,2,99
答案 1 :(得分:0)
使用&amp;返回参考数组操作者
像return &$this->my_array;