PHP数组引用混乱

时间:2010-11-07 06:20:43

标签: php arrays reference

使用此代码:

$a[1]=1;
$a[2]=& $a[1];

$b=$a;
$b[2]=7;

print_r($a);

我希望输出为1,因为$a未通过引用$b$a = & $b)分配,但它是7。为什么呢?

3 个答案:

答案 0 :(得分:4)

您正在按值复制数组,但源数组的元素是引用。这些引用只是浅层复制到目的地。

php > var_dump($a);
array(2) {
  [1]=>
  &int(1)
  [2]=>
  &int(1)
}
php > $b=$a;
php > var_dump($b);
array(2) {
  [1]=>
  &int(1)
  [2]=>
  &int(1)
}

以下是通过引用复制数组的示例:

php > $c[1] = 1;
php > $c[2] =& $c[1];
php > var_dump($c);
array(2) {         
  [1]=>            
  &int(1)
  [2]=>
  &int(1)
}
php > $d =& $c;
php > var_dump($d);
array(2) {
  [1]=>
  &int(1)
  [2]=>
  &int(1)
}
php > $d = array(3,4,5);
php > var_dump($c);
array(3) {
  [0]=>
  int(3)
  [1]=>
  int(4)
  [2]=>
  int(5)
}
php > var_dump($d);
array(3) {
  [0]=>
  int(3)
  [1]=>
  int(4)
  [2]=>
  int(5)
}

如您所见,数组变量(不是元素)本身就是一个引用,因此修改$d会影响$c。重新分配$b本身对$a无效。

答案 1 :(得分:3)

这就是引用的工作原理。当你$a[2]=& $a[1];做什么时,你说的是$ a的两个元素现在都拥有相同的变量。当你执行$ b = $ a,$ b和$ a是不同的变量时,它们内部的所有4个元素都指向同一个变量!尝试$b[3] = 7并看到它没有被复制到$ a - 因为$ b和$ a不同,但是$ b [2]和$ a [2]不是!

参考文献有点乱,抱歉。除非必须,否则不要使用它们。

答案 2 :(得分:0)

这有助于我理解引用的内容:

http://www.php.net/manual/en/features.gc.refcounting-basics.php

http://books.google.com/books?id=e7D-mITABmEC&pg=PT171&lpg=PT171&dq=php+object+zval&source=bl&ots=oawmzMtsXt&sig=mMSuVKsk6L3JWuEikJN8j7dQfRs&hl=ru&ei=JmDWTOraI4TNswaDt-jkCA&sa=X&oi=book_result&ct=result&resnum=10&ved=0CEcQ6AEwCQ#v=onepage&q=php%20object%20zval&f=false

使用xdebug调试有趣的案例也有帮助

例如,您可以“避免”私有属性:

class c{
    private $a = 42;
    function &a(){
        return $this->a;
    }
    function print_a(){
        echo $this->a;
    }
}
$c = new c;
$d = &$c->a();
echo $d;
$d = 2;
$c->print_a();

如果您没有声明它,则通过引用传递:

function f1(&$s) {
    $s++;
}
function f2($s) {
    $s--;
}
$s1 = 1;
$s2 = 3;
f1($s1);
f2(&$s2);
echo $s1.$s2;

也可以使用pass-by-reference

$ a = array(1,2,3); foreach($ a as $ key =>& $ value){     $ value = 1; } $ value = 2;