Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Следующие объекты не применяются к объектам, как уже было сказано здесь. Передача массивов и скалярных значений по ссылке сохранит вашу память только в том случае, если вы планируете изменить переданное значение, потому что 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 никогда не должны передаваться по ссылке, потому что влияние производительности не может быть настолько большим, чтобы оправдать потерю прозрачности в вашем коде.

Ответ 2

В PHP:

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


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


1. Или то, что мы обычно говорим - даже если оно не полностью верно - см. Объекты и ссылкисуб >

Ответ 3

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

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

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

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);

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