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

标签 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; }
}

最佳答案

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/

相关文章:

c++ - 使用动态分配的数组创建哈希表?

java - Hibernate:session.get(EntityName.class, Id) 和使用 Criteria 之间的区别

java - 在指定时间后中断线程 - 问题

java - 在 JDK 7u2 上重写接口(interface)方法时出现 @override 编译器错误

php - 滤波器阵列 - 奇偶

java - 为什么 Java 数组声明使用大括号?

arrays - 配置单元从两个数组创建映射或键/值对

java - 来自 Apache Httpclient 的 DefaultServiceUnavailableRetryStrategy 构造函数

插入数据库前的 PHP 格式数字

javascript - 按钮添加动态div