我是来自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中做同样的事情。
答案 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。