Объяснение ссылок Что такое ссылки Ссылки в PHP - это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели C; например, вы не можете выполнять над ними адресную арифметику, они не являются реальными адресами в памяти и т.д. Для получения дополнительной информации смотрите . Вместо этого указатели в PHP - это псевдонимы в таблице имён переменных. В PHP имя переменной и её содержимое - это разные вещи, поэтому одно содержимое может иметь разные имена. Можно провести аналогию с именами файлов и файлами в Unix: имена переменных - записи в каталоге, а содержимое переменной - это сам файл. Ссылки в PHP - аналог жёстких ссылок в файловых системах Unix. Что делают ссылки Есть три основных операции с использованием ссылок: присвоение по ссылке, передача по ссылке и возврат по ссылке. Данный раздел познакомит вас с этими операциями и предоставит ссылки для дальнейшего изучения. Присвоение по ссылке Первая из них - ссылки PHP позволяют создать две переменные указывающие на одно и то же значение. Таким образом, когда выполняется следующее: ]]> то $a указывает на то же значение что и $b. $a и $b здесь абсолютно эквивалентны, но это не означает, что $a указывает на $b или наоборот. Это означает, что $a и $b указывают на одно и то же значение. При присвоении, передаче или возврате неинициализированной переменной по ссылке, происходит её создание. Использование ссылок с неинициализированными переменными d); var_dump(property_exists($c, 'd')); // bool(true) ?> ]]> Такой же синтаксис может использоваться в функциях, возвращающими ссылки, и с оператором new: ]]> Использование того же синтаксиса с функцией, которая не возвращает по ссылке, приведёт к ошибке, так же как и её использование с результатом оператора new. Хотя объекты передаются как указатели, это не то же самое, что ссылки, как описано в разделе Объекты и ссылки. Если переменной, объявленной внутри функции как global, будет присвоена ссылка, она будет видна только в функции. Чтобы избежать этого, используйте массив $GLOBALS. Присвоение ссылок глобальным переменным внутри функции ]]> Думайте о global $var; как о сокращении от $var =& $GLOBALS['var'];. Таким образом, присвоение $var другой ссылки влияет лишь на локальную переменную. При использовании переменной-ссылки в &foreach;, изменяется содержание, на которое она ссылается. Ссылки и foreach ]]> Хотя в выражениях, создаваемых с помощью конструкции array(), нет явного присвоения по ссылке, тем не менее они могут вести себя как таковые, если указать префикс & для элементов массива. Пример: ]]> Однако следует отметить, что ссылки в массивах являются потенциально опасными. При обычном (не по ссылке) присвоении массива, ссылки внутри этого массива сохраняются. Это также относится и к вызовам функций, когда массив передаётся по значению. Пример: ]]> Иными словами, поведение отдельных элементов массива не зависит от типа присвоения этого массива. Передача по ссылке Второе, что делают ссылки - передача параметров по ссылке. При этом локальная переменная в функции и переменная в вызывающей области видимости ссылаются на одно и то же содержимое. Пример: ]]> Этот код присвоит $a значение 6. Это происходит, потому что в функции foo переменная $var ссылается на то же содержимое, что и переменная $a. Смотрите также детальное объяснение передачи по ссылке. Возврат по ссылке Третье, что могут делать ссылки - это возврат по ссылке. Чем ссылки не являются Как уже было сказано, ссылки не являются указателями. Это означает, что следующая конструкция не будет делать то, что вы ожидаете: ]]> Переменная $var в функции foo будет связана с $bar в вызывающем коде, но затем она будет перепривязана к $GLOBALS["baz"]. Нет способа связать $bar в области видимости вызывающем коде с чем-либо ещё путём использования механизма ссылок, поскольку $bar не доступна в функции foo (доступно лишь её значение через $var, но $var имеет только значение переменной и не имеет связи имя-значение в таблице имён переменных). Вы можете воспользоваться возвратом ссылок из функции для привязки внешней переменной к другому значению. Передача по ссылке Вы можете передать переменную по ссылке в качестве аргумента в функцию, чтобы эта функция могла изменять значение переменной. Синтаксис выглядит следующим образом: ]]> В вызове функции отсутствует знак ссылки - он есть только в определении функции. Этого достаточно для корректной передачи аргументов по ссылке. По ссылке можно передавать: Переменные, например foo($a) Ссылки, возвращаемые функцией, например: ]]> Смотрите также объяснение возврата по ссылке. Любое другое выражение не должно передаваться по ссылке, так как результат не определён. Например, следующая передача по ссылке является неправильной: ]]> Возврат по ссылке Возврат по ссылке используется в тех случаях, когда вы хотите использовать функцию для выбора переменной, с которой должна быть связана данная ссылка. Не используйте возврат по ссылке для увеличения производительности. Ядро PHP само занимается оптимизацией. Применяйте возврат по ссылке только имея технические причины на это. Для возврата по ссылке используйте такой синтаксис: value; } } $obj = new foo; $myValue = &$obj->getValue(); // $myValue указывает на $obj->value, равное 42. $obj->value = 2; echo $myValue; // отобразит новое значение $obj->value, то есть 2. ?> ]]> В этом примере устанавливается свойство объекта, возвращённого функцией getValue, а не его копии, как было бы без использования ссылок. В отличие от передачи параметров по ссылке, & здесь нужно использовать в обоих местах - для указания на то, что вы возвращаете ссылку, а не копию, как обычно, и для указания того, что происходит связывание по ссылке, а не обычное присвоение для $myValue. Если вы возвращаете ссылку из функции, используя следующий синтаксис: return ($this->value);, это не будет работать, так как вы возвращаете по ссылке результат выражения, а не переменную. По ссылке можно возвращать только переменные и ничего больше. Для использования возвращаемой ссылки вы должны применять присвоение по ссылке: ]]> Для передачи возвращаемой ссылки в другую функцию, принимающую ссылку, вы можете использовать следующий синтаксис: ]]> Заметим, что array_push(&collector(), 'foo'); не сработает, а приведёт к неисправимой ошибке. Сброс переменных-ссылок При сбросе ссылки, просто разрывается связь имени и содержимого переменной. Это не означает, что содержимое переменной будет уничтожено. Например: ]]> Этот код не сбросит $b, а только $a. Опять же, можно провести аналогию с вызовом unlink (в Unix). Неявное использование механизма ссылок Многие синтаксические конструкции PHP реализованы через механизм ссылок, поэтому всё сказанное выше о ссылочном связывании применимо также и к этим конструкциям. Некоторые конструкции, вроде передающих и возвращающих по ссылке, рассмотрены ранее. Другие конструкции, использующие ссылки: Ссылки global Если вы объявляете переменную как global $var, вы фактически создаёте ссылку на глобальную переменную. Это означает то же самое, что и: ]]> Это значит, например, что сброс (unset) $var не приведёт к сбросу глобальной переменной.