2010-08-19 1 views
29

Можно создать дубликат: What do the "=&" and "&=" operators in PHP mean?Что делает оператор PHP = & mean?

Я нашел оператор "= &" в следующем коде, и я не знаю, что это значит. Что это значит и что он делает?

код, где я прочитал его:

function ContentParseRoute($segments) 
{ 
    $vars = array(); 

    //Get the active menu item 
    $menu =& JSite::getMenu(); 
    $item =& $menu->getActive(); 

    // Count route segments 
    $count = count($segments); 
     .... 
+3

http://stackoverflow.com/questions/1367454/what-do-operators-in-php-mean – muhmuhten

ответ

7

Это оператор ссылочного присвоения.

Это означает, что когда вы измените LHS оператора позже в коде, он изменит RHS. Вы указываете LHS на тот же блок памяти, что и RHS.

+4

LHS = левосторонний RHS = правая – Htbaa

+0

Это правильно (по крайней мере, вы не сказали, «это фактически два оператора»). Однако последняя фраза немного вводит в заблуждение. В '$ a = $ b;', '$ b' будет, в большинстве случаев, также указывать на тот же блок памяти, что и' $ a'.Разница в том, что переменная будет разделена на модификацию, а если она находится в наборе ссылок, она будет. Может быть, более точным сказать: «Символы на LHS и RHS - это одна и та же переменная» или что-то в этом роде, и оставьте ссылку «память». – Artefacto

+0

Принятый ответ означает, что при изменении RHS, LHS также изменяется. Правильно ли это? –

52

Это не задание (=) по ссылке (&).

Если вы должны были сказать:

$a = 42; 
$b =& $a; 

Вы фактически говоря назначить $aпо ссылке к $b.

Какое назначение по ссылке является «связывать» две переменные вместе. Теперь, если вам нужно будет изменить $a позже, $b изменится вместе с ним.

Например:

$a = 42; 
$b =& $a; 

//later 
echo $a; // 42 
echo $b; // 42 

$a = 13; 
echo $a; // 13 
echo $b; // 13 

EDIT:

Как Artefacto указывает в комментариях, $a =& $b является не такой же, как $a = (&$b).

Это происходит потому, что в то время как оператор & означает сделать ссылку из чего-то, оператор = делает назначения в каждом конкретном значение, поэтому выражение $a = (&$b) средства делают временную ссылку на $b, а затем присвоить значение, что временно до $a, который не является назначением по ссылке.

+9

-1 '$ b = (&$a);) - это недопустимый синтаксис. Я знаю, что это не ваша точка, но' = & 'на самом деле является одним оператором и переводится в опкод' ASSIGN_REF' Это функция не имеет отношения к внутренним наблюдениям. Рассмотрим функцию 'func', которая возвращает по ссылке' $ a = func() '. Эта функция возвращает ссылку, но' $ a' не будет ссылкой, потому что оператор ' = 'нарушает набор ссылок и очищает флаг. Вы должны фактически выполнить' $ a = & $ func() '.' & 'означает 'сделать ссылку из этого (например,' array (& $ a) ') но сделать ссылку недостаточно, чтобы назначить по ссылке. – Artefacto

+3

Действительно, теперь? Я этого не знал, и это никогда не было для меня раньше (по крайней мере, по-видимому). Угадайте, что вы что-то узнаете каждый день. :) Я отредактирую свой ответ для этой коррекции. –

3

Вот пример его использования в:

$array = array('apple', 'orange', 'banana'); 

// Without & 
foreach($array as $d) 
{ 
    $d = 'fruit'; 
} 

echo implode(', ', $array); // apple, orange, banana 

// With & 
foreach($array as &$d) 
{ 
    $d = 'fruit'; 
} 

echo implode(', ', $array); // fruit, fruit, fruit 

не объяснение, но пример того, чтобы быть в состоянии использовать оператор & без использования его в =& задания.

+1

См. Мои комментарии к другим ответам. Не путайте несколько значений '&'. Они все связаны со ссылками, но они не означают одно и то же. – Artefacto

Смежные вопросы