在PHP中,可以通過在函數聲明中的參數前面加上“&”號來通過引用傳遞函數參數,如下所示:function foo(&$bar){ // ...}現在,我知道這不是為了提高性能而設計的,而是允許函數更改通常不在其范圍內的變量。取而代之的是,PHP似乎使用寫時復制來避免在對象被更改之前復制對象(也許還有數組)。因此,對于不更改其參數的函數,效果應與您通過引用傳遞它們的效果相同。但是,我想知道寫時復制邏輯是否可能在傳遞引用時短路,并且這是否會對性能產生影響。ETA:可以肯定的是,我認為它并不快,而且我很清楚這不是引用的目的。所以我想我自己的猜測很好,我是在尋找一個真正知道內幕下肯定會發生什么的人的答案。在PHP開發的五年中,我總是發現很難通過閱讀源代碼獲得有關PHP內部構件的質量信息。
3 回答

互換的青春
TA貢獻1797條經驗 獲得超6個贊
Zend Engine使用寫時復制,當您自己使用引用時,會產生一些額外的開銷。但是,僅在撰寫本文時才能找到此提及,并且手冊中的注釋包含其他鏈接。
(編輯)關于對象和引用的手冊頁包含有關對象變量與引用如何不同的更多信息。

飲歌長嘯
TA貢獻1951條經驗 獲得超3個贊
我對此進行了一些測試,因為我不確定給出的答案。
我的結果表明,按引用傳遞大型數組或字符串的速度明顯更快。
這是我的結果: 基準測試
Y軸(行程)是一個函數在一秒鐘內可以調用多少次* 10
每個功能/變量重復測試8次
這是我使用的變量:
$large_array = array_fill(PHP_INT_MAX / 2, 1000, 'a');
$small_array = array('this', 'is', 'a', 'small', 'array');
$large_object = (object)$large_array;
$large_string = str_repeat('a', 100000);
$small_string = 'this is a small string';
$value = PHP_INT_MAX / 2;
這些是功能:
function pass_by_ref(&$var) {
}
function pass_by_val($var) {
}
添加回答
舉報
0/150
提交
取消