Резюме: Вы беспокоитесь о несуществующей проблеме производительности.
Детали
PHP использует "COW" (Копировать при записи).
Нормальное прохождение ($val
):
- Скаляр - передать значение. Запись в него изменяет только локальную копию.
- Структура / массив / и т.д. - передать указатель на него. Если получатель (
foreach
loop или function
body) хочет изменить какую-либо часть структуры, структура копируется. Стоимость пропорциональна размеру конструкции.
Передача по ссылке (&$val
):
- Скаляр - передайте указатель на скаляр, чтобы внутренности могли его изменить.
- Структура - передать указатель. Если получатель пишет в структуру, он просто (эффективно) проходит через указатель, чтобы добраться до элемента в структуре. Нет коровы.
Мудрость в дизайне заключается в том, что 99% времени PHP "просто работает", и эффективны, и пользователю не нужно знать, что есть два прохождения. методы. Сложность в том, что вам нужно понять, когда делать &$val
вещь.
PHP отличается от практически всех других языков.
- АЛГОЛЬ 60 - Передача по значению или «имени» (вроде как анонимные функции в новых языках)
- FORTRAN - проходить только по «ссылке» (указателю). Недостатком является то, что если вы передаете литерал, получатель может изменить значение литерала! (Хорошо, это была «ошибка», запеченная в старых компиляторах.)
- C - Только передать по значению. Но вы можете сказать (с синтаксисом), что вы хотите указатель на объект, а затем разыменование внутри.
- Паскаль - Значение или Ссылка, но не идентичные чему-либо выше (я забыл детали).
Кажется, что существует почти столько же способов "передать аргументы", сколько существует языков.
Вернуться к вопросу:
- Если вы передаете скаляр, может быть крошечное снижение производительности при наличии
&$val
и прохождении указателя.
- Если вы передаете структуру и вам не нужно писать в нее, вероятно, нулевая разница.
- Если вы передаете структуру и do необходимо написать в нее, тогда вы должны были решить, как передать ее, исходя из того, хотите ли вы сохранить изменения, не по производительности.