Когда полезно использовать pass by reference в PHP?

В C ++, если вы передаете большой массив функции, вам нужно передать ее по ссылке, чтобы она не копировалась в новую функцию, теряющую память. Если вы не хотите, чтобы он был изменен, вы передаете его по ссылке const.

Кто-нибудь может проверить, что передача по ссылке сохранит мне память и в PHP. Я знаю, что PHP не использует адреса для ссылок вроде C ++, поэтому я немного неопределен. Вот в чем вопрос.

Solutions Collecting From Web of "Когда полезно использовать pass by reference в PHP?"

Следующие объекты не относятся к объектам, как уже было сказано здесь. Передача массивов и скалярных значений по ссылке сохранит вашу память только в том случае, если вы планируете изменить переданное значение, потому что PHP использует политику копирования-на-изменении (ака-копирование-на-запись). Например:

# $array will not be copied, because it is not modified. function foo($array) { echo $array[0]; } # $array will be copied, because it is modified. function bar($array) { $array[0] += 1; echo $array[0] + $array[1]; } # This is how bar shoudl've been implemented in the first place. function baz($array) { $temp = $array[0] + 1; echo $temp + $array[1]; } # This would also work (passing the array by reference), but has a serious #side-effect which you may not want, but $array is not copied here. function foobar(&$array) { $array[0] += 1; echo $array[0] + $array[1]; } 

Обобщить:

  • Если вы работаете над очень большим массивом и планируете изменить его внутри функции, вы должны использовать ссылку, чтобы предотвратить ее копирование, что может серьезно снизить производительность или даже исчерпать ограничение вашей памяти.

  • Если это можно избежать (это небольшие массивы или скалярные значения), я бы всегда использовал функциональный подход без побочных эффектов, потому что, как только вы передаете что-то по ссылке, вы никогда не можете быть уверены в том, что может пройти прошедшая переменная после вызова функции, что иногда может привести к неприятным и труднодоступным ошибкам.

  • Скалярные значения IMHO никогда не должны передаваться по ссылке, потому что влияние производительности не может быть настолько большим, чтобы оправдать потерю прозрачности в вашем коде.

В PHP:

  • объекты передаются по ссылке 1 – всегда
  • массивы и скаляры передаются по значению по умолчанию; и может передаваться по ссылке , используя & в объявлении функции.

Для части производительности вашего вопроса PHP не имеет дело с тем же способом, что и C / C ++; вы должны прочитать следующую статью: Не используйте ссылки PHP

1. Или это то, что мы обычно говорим, даже если это не «полностью верно» – см. Объекты и ссылки

Короткий ответ – это ссылки на использование, когда вам нужна функциональность, которую они предоставляют. Не думайте о них с точки зрения использования памяти или скорости. Передача по ссылке всегда будет медленнее, если переменная читается только.

Все передается по значению, включая объекты. Тем не менее, это дескриптор передаваемого объекта, поэтому люди часто ошибочно называют его ссылкой, потому что он выглядит так.

Тогда какую функциональность он предоставляет? Это дает вам возможность изменять переменную в области вызова:

 class Bar {} $bar = new Bar(); function by_val($o) { $o = null; } function by_ref(&$o) { $o = null; } by_val($bar); // $bar is still non null by_ref($bar); // $bar is now null 

Поэтому, если вам нужна такая функциональность (чаще всего это не так), используйте ссылку. В противном случае просто перейдите по значению.

Функции, которые выглядят следующим образом:

 $foo = modify_me($foo); 

иногда являются хорошими кандидатами для передачи по ссылке, но должно быть абсолютно ясно, что функция изменяет переданную в переменной. (И если такая функция полезна, часто это потому, что она действительно должна быть частью некоторого класса, изменяющего свои личные данные.)