直接上代碼吧。希望可以得到大神的分析結果。
$test = array(1, 2, 3, 4, 5);foreach ($test as &$value) { $value = 0;}unset($value);print_r($test);// 結果如下Array( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0)$test = array(1, 2, 3, 4, 5);foreach ((array)$test as &$value) { $value = 0;}unset($value);print_r($test);// 結果如下Array( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5)
如上代碼所示,僅僅是使用了一下數組強制類型轉換,結果卻是截然不同,我想知道為什嗎?
回複內容:
直接上代碼吧。希望可以得到大神的分析結果。
$test = array(1, 2, 3, 4, 5);foreach ($test as &$value) { $value = 0;}unset($value);print_r($test);// 結果如下Array( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0)$test = array(1, 2, 3, 4, 5);foreach ((array)$test as &$value) { $value = 0;}unset($value);print_r($test);// 結果如下Array( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5)
如上代碼所示,僅僅是使用了一下數組強制類型轉換,結果卻是截然不同,我想知道為什嗎?
先看這個例子
$test = array(1, 2, 3, 4, 5);$test1 = $test;foreach ($test1 as &$value) { $value = 0;}print_r($test);Array( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5)
再看這個例子
$test = array(1, 2, 3, 4, 5);$test1 = &$test;foreach ($test1 as &$value) { $value = 0;}print_r($test);Array( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0)
上面連個例子都是先賦值,然後再執行foreach,但是第一個是傳值,而第二個是傳引用(地址),傳值相對於對原array 做了一個copy 賦值到新的變數上,他們在記憶體中指向不是同一個地方。
在看你的第二個例子中的 (array)$test, 這個其實相當於建立一個新的array,這個array 和test 肯定不是指向同一個記憶體位址,所以你foreach中的賦值操作並不會修改原來test變數中的值
(array)$test 這本身是一個賦值操作 等於 $a = (array)$test 然後再 foreach $a
數組(Array) 的賦值總是會涉及到值的拷貝。使用引用運算子&通過引用來拷貝數組
php
$test = array(1, 2, 3, 4, 5);$test2 = (array)$test;$test2[0] = 0;print_r($test);//[1,2,3,4,5]print_r($test2);//[0,2,3,4,5]
foreach遍曆數組的時候,不加引用他每遍曆一次都會釋放掉value得值,如果加了引用,他不會釋放,而被後來的給覆蓋掉[圖片]要相信我,
兩種代碼我輸出opcode,來針對opcode做討論.
在做foreach(xxx as xx)這類操作的時候,調用的指令是FE_REST來重設數組的迭代器.
從我的紅框裡可以清楚的看到,第一次重設的時候用的是!0,也就是$test,第二次用的是~2,也就是(array)$test.
所以你第一次更改的時候,改變的是$test裡的內容,而第二次更改的時候,改變的是(array)$test這個變數裡的內容,意思就是第二次根本就沒更改到$test