2009-05-19 3 views
0

С помощью PHP5, использующего «копировать при записи» и передавая по ссылке, вызывая больше штрафа за производительность, чем выигрыш, почему я должен использовать pass-by-reference? Помимо функций обратного вызова, которые возвращают более одного значения или классов, у которых атрибуты, которые вы хотите изменить, не вызывая функцию набора позже (плохая практика, я знаю), есть ли у нее использование, которое мне не хватает?Нужно ли передавать переменную по ссылке в php5?

ответ

3

Вы используете pass-by-reference, когда хотите изменить результат, и это все, что ему нужно.

Помните также, что в PHP-объектах всегда пересылка по ссылке.

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

+0

Поведение Java идентично поведению PHP (объекты, переданные по ссылке, примитивы переданы ["скопированы"] по значению), как я считаю, C++. На каких строго типизированных языках вы ссылались? –

+2

Java делает * не * передает объекты по ссылке; он копирует значение ссылки на объект; см. http://stackoverflow.com/questions/40480/is-java-pass-by-reference. – Rob

+1

Достаточно честный. Основываясь на примере Laurentb ниже, похоже, что вы можете сказать то же самое о PHP, что только усиливает мою точку зрения: способ передачи аргументов в PHP и Java почти неотличим. Я все еще жду пример «строго типизированного языка», который копирует объекты, переданные как аргументы прямо. –

2

Рекурсивная функция, которая заполняет массив? , один раз.

там нет никакого смысла в том, чтобы сотни копий частично заполненного массива и копирования, сращивания и соединения деталей на каждом шагу.

0

Даже при прохождении объектов есть разница.

Попробуйте это пример:

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 

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