2016-11-24 73 views
0

我碰到這條線:PHP的名單()未定義的行爲

list($diff, $current, $concurrent) = $diff; 

Documentation指出,這將導致不確定的行爲。這種行爲有什麼可能的變種?變量$ diff是數組,包含3個元素,其中包含可變內容。

此行是應用程序的一部分,它包含一個錯誤,並且此行的作者不可用。雖然我幾乎可以肯定,這不是我正在尋找的,但100%肯定會很高興。 我使用PHP 5.6.25作爲FPM/FastCGI。 在此先感謝。

+0

你能編輯應用程序代碼嗎?如果是這樣'$ array = $ diff; list($ diff,$ current,$ concurrent)= $ array;'將消除任何未定義的行爲。 – Steve

+0

由於某種原因未定義,根據您的版本/操作系統等不同,它可能會有不同的效果。您正在評估「$ diff」時用'$ diff'覆蓋'$ diff'。也許做@Steve建議或者改變'list($ diff ...'變量會有所幫助。 –

+0

如果我在改善我的問題上得到2條評論,而不是2條評論,我會很高興。 – svgrafov

回答

1

作爲documentation for list()還指出:

在PHP 5,列表()分配的值開始於最右邊的參數。在PHP 7中,list()以最左邊的參數開始。

換句話說:此行可能在PHP 5中按照預期工作,因爲兩側出現的變量$diff是要分配的最後一個變量。但是,在PHP 7中,變量$diff首先被分配,所以$diff已經在$current$concurrent的分配完成時發生了變化。

總的來說,我認爲關於未定義行爲的暗示與這樣一個事實有關,即如果某個變量出現在=符號的兩側,則不能依靠某些賦值來產生預期結果。解決此問題的方法可能如下所示:

list($temp, $current, $concurrent) = $diff; 
$diff = $temp; 
unset($temp); 

這樣可以避免未定義的行爲。