2011-10-07 100 views
1

我很困惑PHP變量引用是如何工作的。在下面的示例中,我希望能夠以$bar[0]$barstack[0][0]訪問字符串hello。看起來,在步驟1中通過引用來傳遞數組應該足夠了。PHP變量:引用或副本

第二個示例不起作用。 $foostack[0]0]是字符串你好,但$foo[0]不存在。在某些時候,$ foostack的第一個元素變成了$ foo的副本,而不是引用。

問題在於步驟2的第一行:當我推入參考時,我希望關閉參考。但array_pop代替返回副本。

其他人告訴我,如果我不得不擔心引用和副本,那麼PHP不適合我。這可能是我要得到的最好答案。

FWIW,爲了使var_dump有用,它需要顯示區分參考和副本的某些屬性。它不是。也許還有另一個功能?

我的第一個PHP項目似乎很糟糕。有人可以幫助闡明這個代碼的 問題嗎?

<?php 
echo "// This works!\n<br />" ; 

// step 1 
$bar = array() ; 
$barstack = array(&$bar) ; 

// step 2 
array_push($barstack[0], 'hello') ; 

// results 
echo count($barstack[0]) .';' .count($bar) ; 


echo "\n<br />// This doesn't :(\n<br />" ; 

// step 1 
$foo = array() ; 
$foostack = array(&$foo) ; 

// step 2 
$last = array_pop($foostack) ; 
array_push($last, 'hello') ; 
array_push($foostack, &$last) ; 

// results 
echo count($foostack[0]) .';' .count($foo) ; 


echo "\n<br />// Version:\n<br />" ; 
echo phpversion() ."\n" ; 
?> 

的結果可以在以下URL被看作:

http://www.gostorageone.com/tqis/hi.php

版是4.3.10。升級服務器並不實際。

預期結果:

  1. 解釋顯然如果我忽略了它
  2. 這是一個錯誤?任何解決方法?

謝謝!

-Jim

+1

自己發佈前檢查。你可以使用var_dump($ array),它會告訴你數組中的內容。那麼一切都會很清楚。 –

+0

對我來說,這個問題似乎不適合StackOverflow的規則 –

+1

@Sunny Jim - 爲了得到更好的回答,請嘗試在你的問題中添加你期望發生的事情和實際發生的事情。一半是由你的鏈接覆蓋的,但另一半則不是。 –

回答

2

你的代碼工作正常,沒有錯誤,而且是獨立於PHP 4或5,也許它幫助,如果這僅僅是向你解釋。

讓我們通過例子並不在你的眼前的工作,只是在尋找到底發生了什麼:

// step 1 
$foo = array(); # 1. 
$foostack = array(&$foo); # 2. 
  • 1:您初始化變量$foo爲空數組。
  • 2 .:您將變量$foostack初始化爲一個數組,並且該數組的第一個元素是變量$foo的別名。這是完全一樣的文字:$foostack[] =& $foo;

在下一步:

// step 2 
$last = array_pop($foostack); # 3. 
array_push($last, 'hello'); # 4. 
array_push($foostack, &$last); # 5. 
  • 3:您指定的最後一個元素的數組$foostack$last和刪除來自陣列$foostack的最後一個元素。 注意:array_pop返回一個值,而不是參考。
  • 4 .:您將'hello'作爲新元素添加到$last中的空數組中。
  • 5 .:您將&$last作爲新元素添加到$foostack;

那麼我們現在有哪些變量?

  • 首先是$foo其中只包含一個空數組。 $foostack的最後一個元素曾經引用它(2.),但是您已經在(3.)之後直接刪除了它。由於$foo的價值並沒有改變,它只是一個空的數組array()
  • 然後是$last,它在3中得到了一個空數組。這只是一個空數組,它是一個不是引用的值。在(4.)中,將字符串'hello'作爲第一個元素添加到它。 $last是一個數組,其中有一個字符串元素。
  • 然後有$foostack。這是一個數組,在(2.)中得到對$foo的引用,然後在(3.)中刪除該引用。最後添加一個到$last的別名。

這正是你的代碼輸出的其餘部分:

echo count($foostack[0]) .';'. count($foo); 

$foostack[0]是別名$last - 以字符串'hello'作爲唯一元素的數組,而$foo只是$foo,空數組array()

這沒有什麼區別,如果你執行與PHP 4或5


當你寫這是「錯誤的」,我以爲你只是無法達到你想要的東西。您可能正在尋找一個函數,在刪除它之前能夠將引用返回到數組的最後一個元素。讓我們來調用該函數array_pop_ref()

// step 1 
$foo = array(); 
$foostack = array(&$foo); 

// step 2 
$last =& array_pop_ref($foostack); 
array_push($last, 'hello'); 
array_push($foostack, &$last); 

// results 
echo count($foostack[0]) .';' .count($foo); # 1;1 

array_pop_ref功能:

function &array_pop_ref(&$array) 
{ 
    $result = NULL; 
    if (!is_array($array)) return $result; 
    $keys = array_keys($array); 
    $end = end($keys); 
    if (false === $end) return $result; 
    $result =& $array[$end]; 
    array_pop($array); 
    return $result; 
} 
+0

謝謝。至少有一個小時的諮詢!可能救了我幾天的絆腳石。 –

+0

PHP手冊還提供了關於該主題的更多信息(事實上相當多),我認爲將引用作爲可變別名考慮是個好主意。看到這裏:[參考文獻解釋](http://php.net/manual/en/language.references.php)。 – hakre