У меня есть некоторые знания C ++, и я знаю, что там часто используются указатели, но я начал изучать открытый исходный код PHP и никогда не вижу кода, использующего ссылки в методах.
Вместо этого код всегда использует возвращаемое значение вместо передачи ссылки на переменную в метод, который затем изменяет значение этой переменной и просто возвращает его.
Я читал, что использование ссылок использует меньше памяти, так почему они не используются в PHP?
return array($foo, $bar);
иlist($A, $B) = foobar();
Ответы:
Ваше утверждение, что ссылки используются редко, неверно. Как уже упоминалось, есть множество нативных функций, которые используют ссылки, известные примеры включают функции сортировки массивов и
preg_match()
/preg_match_all()
. Если вы используете любую из этих функций в своем коде, вы также используете ссылки.В дальнейшем ссылки в PHP не являются указателями. Так как вы пришли из C ++, я могу понять путаницу, но ссылки на PHP - это совершенно другой зверь, они являются псевдонимами таблицы символов . Любой прирост производительности, который вы могли ожидать от ссылок C ++, просто не применим к ссылкам PHP.
Фактически, в большинстве сценариев передача по значению происходит быстрее и требует меньше памяти, чем передача по ссылке. Zend Engine, ядро PHP, использует механизм оптимизации копирования при записи , который не создает копию переменной, пока она не будет изменена. Передача по ссылке обычно нарушает шаблон копирования при записи и требует копию независимо от того, изменили вы значение или нет.
Не бойтесь использовать ссылки в PHP, когда это необходимо, но не делайте это как попытку микрооптимизации. Помните, преждевременная оптимизация - корень всего зла .
Дальнейшее чтение:
источник
f($obj)
даноfunction f($x) { $x = new X; }
, будет иметь ссылку$obj
на другой объект, чем до вызоваf()
. Однако, поскольку объекты не передаются по ссылке, $ obj не изменяется, если вы выполняете это с помощью PHP. Таким образом, PHP делает то же самое, что и Java.PHP уже выполняет функцию копирования при записи, где он не создает новое значение, пока вы что-то не измените, поэтому при использовании ссылок не так много памяти сохраняется. Это может даже испортить некоторые вещи, которые PHP делает внутренне, чтобы уменьшить использование памяти, что делает вещи еще хуже.
Добавьте к этому тот факт, что ссылки делают вещи слишком волшебными в целом. По умолчанию и, следовательно, то, что большинство людей ожидают, это передача по значению; когда я перехожу
$i
к функции, это очень усложняет задачу: нужно ли заботиться о том, таинственно ли эта функция меняется$i
на что-то другое, и, таким образом, делать защитные копии на всякий случай. (Он уже может измениться,$i
если значение является объектом, но, по моему мнению, не должен.)В принципе, я бы только найти проход по ссылке полезной для «из» параметров, то есть переменный я ожидать , чтобы вернуться из функции , а не переходит в, а - ля
preg_match
«ы&$matches
. Даже для функций, которые явно изменяют передаваемый объект, вродеsort
илиarray_pop
, это кажется немного странным ... но это то, с чем мы застряли.источник
PHP - это веб-ориентированный язык.
Веб-страницы обслуживаются быстро и должны быть легкими.
Обычная PHP-программа живет доли секунды и потребляет несколько сотен килобайт памяти.
Там нет смысла для такой оптимизации.
источник
Несколько причин на лету:
источник
Я думаю, что это просто выбор разработчиков, ничего общего с языком. Много PHP-кода (встроенного и не) использовать ссылки. Посмотрите на функции массива в PHP, многие из них используют ссылки.
preg_match
использует ссылки.Я думаю, что одна из причин, по которой разработчики решили не использовать ссылки, заключается в том, что это может сбить с толку. Вы вызываете функцию, и одна из переменных может (или не может) обновляться, потому что это была ссылка. Таким образом, при отладке может быть непонятно, почему значение
$x
jsut волшебным образом изменилось.источник
Основная проблема в вашем вопросе состоит в том, что вы предполагаете, что это распространено и в C ++. Это не так. Нам не нравятся выходные параметры, и мы используем их как можно меньше - они действительно распространены только в API в стиле C.
источник
Я знаю много функций PHP, которые делают это. Посмотрите,
preg_match()
например.$matches
будет передано по ссылкеЕсли вы хотите написать для себя функцию, которая принимает аргументы по ссылке, используйте следующий синтаксис
$ a и $ b передаются по ссылке. $ c передается по значению.
источник