为什么我的变量不指向同一个数组?

时间:2014-12-18 19:03:10

标签: java php arrays

我有两节课。具有数组(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; }
}

2 个答案:

答案 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;

这样的东西