создание и продвижение сайта (вбиваю в ТОП-10, как гвозди)Настройка и сопровождение платной рекламы яндекс.директ

PHP. Руководство по PHP. 2005

Что делают ссылкиПред.Глава 21. Ссылки. РазъясненияСлед.

Что делают ссылки

Ссылки в PHP дают возможность двум переменным ссылаться на одно содержимое. Например:

<?

$a =& $b;

?>

означает, что $a указывает на то же содержание, что и $b.

Замечание: $a и $b здесь абсолютно эквивалентны, но это не означает, что $a указывает на $b или наоборот. Это означает, что $a и $b указывают на одно место.

Замечание: При копировании массива ссылок, они не разыменовываются. Это также касается массивов, передаваемых функциям по значению.

Такой же синтаксис можно использовать и в функциях, возвращая ссылки, а так же в операторе new (начиная с PHP4.0.4):

<?

$bar =& new fooclass();

$foo =& find_var($bar);

?>

Замечание: Если опустить &, это приведёт к копированию объекта. Если вы используете $this в классе, операция проводится над текущим экземпляром этого класса. Присвоение без & приведёт к копированию экземпляра, и $this будет работать с копией, что не всегда желательно. Обычно, вам нужно иметь 1 экземпляр, из соображений производительности и использования памяти.

Операция @, которая скрывает сообщения об ошибках, например в конструкторе @new, не может быть использована совместно с операцией & (&new). Это ограничение интерпретатора Zend.

Внимание
- Если переменной, объявленной внутри функции как global, будет присвоена ссылка, она будет видна только в функции. Чтобы избежать это, воспользуйтесь массивом $GLOBALS.

Пример 21-1. Присвоение ссылок глобальным переменным внутри функции

<?

$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

<?

$ref = 0;

$row =& $ref;

foreach (array(1, 2, 3) as $row){

//do something

}

echo $ref; //3 - последнее значение, используемое в цикле

?>

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

Пример 21-3. Ссылки и сложные массивы

<?

$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()

?>

Второе, что делают ссылки - передача параметров по ссылке. При этом локальная переменная в функции и переменная в области видимости вызывателя ссылаются на одно и то же содержимое. Пример:

<?

function foo(&$var)

{

$var++;

}

$a=5;

foo($a);

?>

Этот код присвоит $a значение 6. Это происходит, потому что в функции foo переменная $var ссылается на то же содержимое, что и переменная $a. См. также детальное объяснение передачи по ссылке.

Третье, что могут ссылк - возвращение значение по ссылке.

Пред.

Начало

След.

Ссылки. Разъяснения

Уровень выше

Чем ссылки не являются

Отвечу на любые вопросы. С уважением, Дмитрий Владимирович.

Ваше письмо×
Free Web Hosting