views: 1489 times


這好像是 PHP5 跟 PHP4 之間的一些問題。預設值來看,allow_call_time_pass_reference 是打開的,但是基於一些安全性的理由,有些伺服器會將這個設定關閉,而在 PHP 官方網站上,也說對於這個設定值在未來的版本將不繼續支援。至於為什麼會出現這樣的問題,主要是跟傳值與傳址有關。
在 PHP4 中,如果是 Call by Reference(or Call by Address),他是這樣運作:
然而在 PHP5,因為他預設都是 pass by reference,假設你程式有寫的話,意思就是說,再傳入時不用特別指定他是 call by reference,就直接丟進去就好(也就是說他不會因為你加了 & 而強制使用傳址,一律使用傳值)。
這是最主要的差異,當然我不是真的在 PHP4 上這樣測試過,但是官方是這樣說的。而 allow_call_time_pass_reference 的設定就是,你在呼叫函式的時候強制以傳址的方式傳遞,預設都是 On,而如果遇到將這個設定值關閉的主機,就必須要留意函式與呼叫的寫法。換句話說,就是你在呼叫的時候不能使用定址的方式去呼叫,不然會發生像是這樣的錯誤。大意是說,因為無法使用傳址的方式,所以你的呼叫將會使用傳值的方式去傳遞。
所以,依照官方的說法,在 PHP5 呼叫時,直接使用 $ 給變數傳入即可,並不需要再另外指定 & 再傳入,這樣反而會發生錯誤(因為已經沒有了強制傳址的設定)。但,至於在 PHP4 中是否在呼叫時同時要指定 &,這個我就不得而知了。不過,目前看來,若是將 allow_call_time_pass_reference 關閉的話,勢必是要修改不少的 code 的。但是,由於這個功能在未來的 Zend/PHP 不再支援,所以在開發時,是必要將這個設定值關閉,以確保能夠在往後更新版本的環境下能正確執行。
在 PHP4 中,如果是 Call by Reference(or Call by Address),他是這樣運作:
然而在 PHP5,因為他預設都是 pass by reference,假設你程式有寫的話,意思就是說,再傳入時不用特別指定他是 call by reference,就直接丟進去就好(也就是說他不會因為你加了 & 而強制使用傳址,一律使用傳值)。
這是最主要的差異,當然我不是真的在 PHP4 上這樣測試過,但是官方是這樣說的。而 allow_call_time_pass_reference 的設定就是,你在呼叫函式的時候強制以傳址的方式傳遞,預設都是 On,而如果遇到將這個設定值關閉的主機,就必須要留意函式與呼叫的寫法。換句話說,就是你在呼叫的時候不能使用定址的方式去呼叫,不然會發生像是這樣的錯誤。大意是說,因為無法使用傳址的方式,所以你的呼叫將會使用傳值的方式去傳遞。
所以,依照官方的說法,在 PHP5 呼叫時,直接使用 $ 給變數傳入即可,並不需要再另外指定 & 再傳入,這樣反而會發生錯誤(因為已經沒有了強制傳址的設定)。但,至於在 PHP4 中是否在呼叫時同時要指定 &,這個我就不得而知了。不過,目前看來,若是將 allow_call_time_pass_reference 關閉的話,勢必是要修改不少的 code 的。但是,由於這個功能在未來的 Zend/PHP 不再支援,所以在開發時,是必要將這個設定值關閉,以確保能夠在往後更新版本的環境下能正確執行。




Leave your greetings.