PHP5 foreach物件陣列需要注意的問題

2021-05-01 19:27:25 字數 1148 閱讀 7517

submitted by marsmus on 2009, june 9, 11:32 pm. php

先看一段**,從這段**引入問題。仔細閱讀以下示例**,看有什麼問題(之前不了解php5 foreach 物件陣列的處理,以為和普通陣列一樣,是對乙個拷貝進行處理)

從輸出結果可以看出$element_list中物件的資料已經改變,這和原先我們所了解的使用foreach遍歷陣列元素,對元素進行處理不會影響到原陣列的值是相衝突的,是不是php有bug呢?並不是,出現這種情況的原因是,php5對所有物件都是使用引用,這與php4是完全不同的,php4在新建物件是要使用&操作符來說明等到的是物件的引用。

既然是引用,那麼$element_list陣列裡面儲存的也都只是element物件的引用而不是乙個物件拷貝。然後我們回到foreach中來,foreach處理陣列時,是把原陣列拷貝乙個後,再從中拿出每個元素,我們使用foreach對這些元素進行處理,並不是對原陣列的處理,而只是對乙個拷貝的處理,所以不管我們怎麼改變其值,原陣列的值是不會改變的(這個只對普通的變數有用,php5中的物件就不適用了)。如果當前陣列是物件陣列,那麼在php5下,其值就是物件的引用,當我們使用foreach對其進行處理時,情況是這樣的,如下:

1.首先拷貝乙個$element_list,我們把它叫做$element_list_copy。在foreach的處理中,所有處理都是對$element_list_copy陣列的處理,並不影響原陣列$element_list

2.得到$element_list_copy中的乙個元素,對其進行處理,此時$element_list_copy中的元素也是乙個$element物件的引用,它和$element_list中的值是一樣的,都是乙個$element物件的引用,它們兩個指向的是同一塊記憶體空間,所以對$element_list_copy元素的處理和對$element_list元素的處理,所操作的資料塊是相同的,也就是$element_list_copy中的元素改變了,$element_list中的元素也會相應地改變,因為$element_list_copy和$element_list的元素所指向的是同一塊記憶體,都是同乙個$element物件。

這也就是為什麼經過foreach處理後,物件陣列$element_list中的物件的資料發生了改變。千萬要注意php5下物件陣列及一般陣列使用foreach處理的區別,不然就很有可能出現讓人摸不著頭腦的錯誤產生。

PHP 陣列 foreach用法

foreach用於陣列 foreach僅能用於陣列,每次迴圈中,當前單元的鍵名也會在每次迴圈中被賦給變數 key。當前單元的值被賦給 value 並且陣列內部的指標向前移一步。有兩種語法 foreach array expression as value statement foreach arra...

php5 理解 以及結合foreach

做為菜菜子的我,這個 不記得了。現在複習下 下面解釋下 通過這種方式 a test 得到的其實不是函式的引用返回,這跟普通的函式呼叫沒有區別.至於原因 這是php的規定 php規定通過 a test 方式得到的才是函式的引用返回.至於什麼是引用返回呢 手冊上說 引用返回用在當想用函式找到引用應該被繫...

PHP 陣列遍歷 foreach 語法結構

foreach 語法結構用於遍歷陣列。php foreach 語法結構用於遍歷操作或輸出陣列,foreach 僅能用於遍歷陣列或物件,當試圖將其用於其它資料型別或者乙個未初始化的變數時會產生錯誤。語法 foreach array as value statement 或者 foreach array...