簡體   English   中英

PHP數組引用混亂

[英]PHP Array reference confusion

使用此代碼:

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

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

print_r($a);

我期望輸出為1因為$a不是通過引用$b$a = & $b )來分配的,而是7 為什么?

您是按值復制數組,但源數組的元素是引用。 這些引用只是淺層復制到目標。

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沒有影響。

這就是參考工作的方式。 當你做$a[2]=& $a[1];時,你在說什么 是$ a的兩個元素現在都擁有相同的變量。 當你執行$ b = $ a,$ b和$ a是不同的變量時,它們內部的所有4個元素都指向同一個變量! 嘗試做$b[3] = 7並看到它沒有復制到$ a - 因為$ b和$ a不同,但$ b [2]和$ a [2]不是!

參考文獻有點亂,抱歉。 除非必須,否則不要使用它們。

這有助於我理解什么是參考資料:

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 =假

使用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;

foreach也可以使用pass-by-reference

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM