С помощью PHP5, использующего «копировать при записи» и передавая по ссылке, вызывая больше штрафа за производительность, чем выигрыш, почему я должен использовать pass-by-reference? Помимо функций обратного вызова, которые возвращают более одного значения или классов, у которых атрибуты, которые вы хотите изменить, не вызывая функцию набора позже (плохая практика, я знаю), есть ли у нее использование, которое мне не хватает?Нужно ли передавать переменную по ссылке в php5?
ответ
Вы используете pass-by-reference, когда хотите изменить результат, и это все, что ему нужно.
Помните также, что в PHP-объектах всегда пересылка по ссылке.
Лично я считаю, что система копирования значений PHP неявно (я думаю, для защиты от случайной модификации) громоздка и неинтуитивна, но с другой стороны я начал с строго типизированных языков, что, вероятно, объясняет это. Но мне интересно, что объекты отличаются от обычной работы PHP, и я считаю это доказательством того, что механизм неявного копирования PHP не является действительно хорошей системой.
Рекурсивная функция, которая заполняет массив? , один раз.
там нет никакого смысла в том, чтобы сотни копий частично заполненного массива и копирования, сращивания и соединения деталей на каждом шагу.
Даже при прохождении объектов есть разница.
Попробуйте это пример:
class Penguin { }
$a = new Penguin();
function one($a)
{
$a = null;
}
function two(&$a)
{
$a = null;
}
var_dump($a);
one($a);
var_dump($a);
two($a);
var_dump($a);
Результат будет:
object(Penguin)#1 (0) {}
object(Penguin)#1 (0) {}
NULL
Когда вы передаете переменную, содержащую ссылку на объект по ссылке, вы можете изменить ссылку на объект.
Поведение Java идентично поведению PHP (объекты, переданные по ссылке, примитивы переданы ["скопированы"] по значению), как я считаю, C++. На каких строго типизированных языках вы ссылались? –
Java делает * не * передает объекты по ссылке; он копирует значение ссылки на объект; см. http://stackoverflow.com/questions/40480/is-java-pass-by-reference. – Rob
Достаточно честный. Основываясь на примере Laurentb ниже, похоже, что вы можете сказать то же самое о PHP, что только усиливает мою точку зрения: способ передачи аргументов в PHP и Java почти неотличим. Я все еще жду пример «строго типизированного языка», который копирует объекты, переданные как аргументы прямо. –