|
Ссылки в PHP дают возможность двум переменным ссылаться на одно содержимое. Например:
означает, что $a указывает на то же содержание, что и $b.
Замечание:
$a и $b здесь абсолютно эквивалентны, но это не означает, что $a указывает на $b или наоборот. Это означает, что $a и $b указывают на одно место.
Замечание:
При копировании массива ссылок, они не разыменовываются.
Это также касается массивов, передаваемых функциям по значению.
Такой же синтаксис можно использовать и в функциях, возвращая ссылки, а так же в операторе new (начиная с PHP 4.0.4):
Замечание:
Если опустить &, это приведёт к копированию объекта.
Если вы используете $this в классе, операция проводится над текущим экземпляром этого класса.
Присвоение без & приведёт к копированию экземпляра, и $this будет работать с копией, что не всегда желательно.
Обычно, вам нужно иметь один экземпляр, из соображений производительности и использования памяти.
Операция @, которая скрывает сообщения об ошибках, например в конструкторе @new, не может быть использована совместно с операцией & (&new).
Это ограничение интерпретатора Zend.
Внимание |
Если переменной, объявленной внутри функции как global, будет присвоена ссылка, она будет видна только в функции.
Чтобы избежать это, воспользуйтесь массивом $GLOBALS.
Пример 21-1. Присвоение ссылок глобальным переменным внутри функции
<?php $var1 = "Example variable"; $var2 = "";
function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 =& $var1; // только локально } else { $GLOBALS["var2"] =& $var1; // глобально } }
global_references(false); echo "значение var2: '$var2'\n"; // значение var2: '' global_references(true); echo "значение var2: '$var2'\n"; // значение var2: 'Example variable' ?>
|
|
Думайте о global $var; как о сокращении от $var =& $GLOBALS['var'];. Таким образом, присвоение $var другой ссылки влияет лишь на локальную переменную.
|
Замечание:
При использовании переменной-ссылки в foreach,
изменяется содержание, на которое она ссылается.
Пример 21-2. Ссылки и foreach
<?php $ref = 0; $row =& $ref; foreach (array(1, 2, 3) as $row) { // do something } echo $ref; // 3 - последнее значение, используемое в цикле ?>
|
|
Внимание |
Сложные массивы в некоторых случаях могут копироваться вместо создания ссылок. например, следующий пример не будет работать как ожидалось.
Пример 21-3. Ссылки и сложные массивы
<?php $top = array( 'A' => array(), 'B' => array( 'B_b' => array(), ), );
$top['A']['parent'] = &$top; $top['B']['parent'] = &$top; $top['B']['B_b']['data'] = 'test'; print_r($top['A']['parent']['B']['B_b']); // array() ?>
|
|
|
Второе, что делают ссылки - передача параметров по ссылке.
При этом локальная переменная в функции и переменная в области видимости вызывателя ссылаются на одно и то же содержимое.
Пример:
Этот код присвоит $a значение 6. Это происходит, потому что в функции foo переменная $var ссылается на то же содержимое, что и переменная $a. См. также детальное объяснение передачи по ссылке.
Третье, что могут ссылк - возвращение значение по ссылке.
| |