Разница в производительности PHP метода передачи переменных - PullRequest
0 голосов
/ 23 мая 2010

Будет ли какая-либо ощутимая разница в производительности при передаче данных в виде значений вместо ссылок в PHP?

Кажется, мало кто знает, что переменные могут передаваться как значения, а не как ссылки. Это здравый смысл или нет?

Ответы [ 4 ]

3 голосов
/ 23 мая 2010

Насколько я понимаю, PHP 5 передает простые типы данных и массивы по значению, но когда дело доходит до объектов, он передается по ссылке. Похоже, это поведение, о котором вам следует знать - я предполагаю, что массивы передаются по значению, и поэтому большие могут привести к снижению производительности, если вам не требуется делать копию.

Я видел множество аргументов против явной передачи по ссылке и позволения PHP делать свое дело.

Кроме того, если вы хотите передать объект по значению, вы должны клонировать его, в идеале.

1 голос
/ 23 мая 2010

Объекты всегда передаются по ссылке, если вы используете последнюю версию PHP. Что касается другого типа, основной проблемой являются строки / массив. Для тех это зависит. Реализация строк в PHP делает так, что если вы не измените строку, передаваемую в аргумент функции (вы только читаете / сканируете ее), она никогда не будет скопирована. Реализация называется «копирование при записи». Я не уверен насчет массива, мне нужен тест для ответа.

Если вы не измените переданный по значению строковый аргумент, не будет никакой разницы с переданным по ссылке.

1 голос
/ 23 мая 2010

Если вы передаете большую переменную по значению (которая используется по умолчанию для всего, кроме объектов в PHP5 +), то да, вы можете получить снижение производительности.

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

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

1 голос
/ 23 мая 2010

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

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

Хотя я не уверен, что вы имели в виду под последней частью. По умолчанию PHP передает аргументы по значению.

...