PHP: Что делают ссылки - Manual

downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Чем ссылки не являются Ссылки. Разъяснения

Last updated: Sat, 27 Jan 2007

view this page in

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

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

`<?php $a =& $b; ?>`

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

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

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

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

`<?php $bar =& new fooclass(); $foo =& find_var($bar); ?>`

> Замечание: Если опустить `&`, это приведёт к копированию объекта. Если вы используете `$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()
?>`

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

`<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
?>`

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

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

add a note User Contributed Notes
Что делают ссылки
php at hood dot id dot au
04-Mar-2007 10:56
`I discovered something today using references in a foreach
<?php
$a1 = array('a'=>'a');
$a2 = array('a'=>'b');
foreach ($a1 as $k=>&$v)
$v = 'x';
echo $a1['a']; // will echo x
foreach ($a2 as $k=>$v)
{}
echo $a1['a']; // will echo b (!)
?>
After reading the manual this looks like it is meant to happen. But it confused me for a few days!
(The solution I used was to turn the second foreach into a reference too)`
ladoo at gmx dot at
17-Apr-2005 02:05
`I ran into something when using an expanded version of the example of pbaltz at NO_SPAM dot cs dot NO_SPAM dot wisc dot edu below.
This could be somewhat confusing although it is perfectly clear if you have read the manual carfully. It makes the fact that references always point to the content of a variable perfectly clear (at least to me).
<?php
$a = 1;
$c = 2;
$b =& $a; // $b points to 1
$a =& $c; // $a points now to 2, but $b still to 1;
echo $a, " ", $b;
// Output: 2 1
?>`
php.devel at homelinkcs dot com
15-Nov-2004 03:16
`In reply to lars at riisgaardribe dot dk,
When a variable is copied, a reference is used internally until the copy is modified. Therefore you shouldn't use references at all in your situation as it doesn't save any memory usage and increases the chance of logic bugs, as you discoved.`
joachim at lous dot org
10-Apr-2003 03:46
`So to make a by-reference setter function, you need to specify reference semantics _both_ in the parameter list _and_ the assignment, like this:
class foo{
var $bar;
function setBar(&$newBar){
$this->bar =& newBar;
}
}
Forget any of the two '&'s, and $foo->bar will end up being a copy after the call to setBar.`
add a note
Чем ссылки не являются Ссылки. Разъяснения

Last updated: Sat, 27 Jan 2007
show source | credits | stats | sitemap | contact | advertising | mirror sites
Copyright © 2001-2007 The PHP Group
All rights reserved.
This mirror generously provided by: Yahoo! Inc.
Last updated: Sat Mar 10 11:33:19 2007 PST