我怎样才能获得数组的地址?

时间:2016-03-29 07:55:48

标签: php

我是来自C ++ / Python / Java的PHP的新用户。在PHP中,有一个内置的数组类型,如何在插入新对象或旧对象的副本后证明数组是相同的数组?在C ++ / Python / Java中,我可以使用对象地址,id()或hashcode来测试对象是否相同,我如何在PHP中进行相同的测试?

<?php
    $a['0'] = "a";
    $a['1'] = 'b'; //here, $a is a new copied one or just a reference to the old?
?>

好的,我更新了我的问题,实际上,没有具体问题。我只是想知道在插入新值之前和之后数组对象是否保持相同。 在Python中,我可以进行这样的测试:

a = [1]

print id(a)
a.append(2)
print id(a)

BTW,这是Python中的id()函数手册。

id(...)
    id(object) -> integer

    Return the identity of an object.  This is guaranteed to be unique among
    simultaneously existing objects.  (Hint: it's the object's memory address.)

代码已更新:

 # -*- coding: utf-8 -*-

a = [1, 2, 3]
b = [1, 2, 3]

print id(a)
print id(b)  //the id(b) is not same as id(a), so a and b has same content, but they both own their own values in the memory

c = a  // c is a reference to a 
c.append(4)
print c
print a  //after appending a new value(which means insert a new value to array), a has same value as c

所以问题是我可以通过C ++ / Python / Java中的代码证明内存布局,我想确保我是否可以在PHP中做同样的事情。

3 个答案:

答案 0 :(得分:5)

默认情况下,在PHP中,只有对象通过引用分配。其他所有内容(包括数组)都按值分配。使两个指向同一数组的变量的唯一方法是使用\x1b(B运算符显式设置引用。 References Explained章节对这个主题给出了很好的概述。

对于对象,您可以轻松地发现引用,即使使用简单的&

也是如此
var_dump()
$a = new DateTime;
$b = $a;
$c = clone $a;
var_dump($a, $b, $c);

请注意object(DateTime)#1 (3) { ["date"]=> string(26) "2016-03-29 10:18:28.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Madrid" } object(DateTime)#1 (3) { ["date"]=> string(26) "2016-03-29 10:18:28.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Madrid" } object(DateTime)#2 (3) { ["date"]=> string(26) "2016-03-29 10:18:28.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Madrid" } #1共享的$a标识符。

其他类型根本不是微不足道的。在上述章节的Spotting References部分中,user comment包含一些您可能需要检查的复杂代码,但它已经很老了。

答案 1 :(得分:4)

是的,阵列保持不变&#34;对象&#34; (当然,不是PHP称之为,而是在概念上)修改其内容。副本(&#34;软拷贝&#34;,写时复制副本)仅在您

时制作
  • 将数组分配给另一个变量,而不使用引用(=&
  • 将其传递给函数,不带参考
  • return来自函数,不带参考

(这实际上完全相同:将其分配给另一个变量。)

答案 2 :(得分:3)

除了@Anant发布的内容之外,请参阅PHP Reference Counting,其中说明了PHP运行时引擎如何存储变量。

你会看到偶数数组成员是可以由其他对象,数组和变量指向(引用)的引用。因此,在C或Python中的两个“相同”数组可能存在于内存中的两个不同位置,PHP将分别存储指向单个值的引用。

如果其中一个值由两个非引用变量指向,则它将为更改的值创建一个新引用,现在每个变量指向不同的引用。这是Copy On Write优化。

StackExchange编程的这篇文章也很好。第一个答案提供了更多好的链接:Why are array references rarely used