иногда мы объявляем & перед функцией в кодировании на основе классов

Я следую кодированию на основе классов для разработки проекта. Недавно я видел, что иногда мы ставим «&» перед именем функции.

для примера..

а не определение

function test()

это определяется как

function &test()

есть ли особое значение "&"?


person Rukmi Patel    schedule 29.12.2011    source источник


Ответы (3)


Как упоминает @philip, нужно вернуть ссылку:

Из приведенной выше ссылки:

Примечание. В отличие от передачи параметров, здесь вы должны использовать & в обоих местах — чтобы указать, что вы хотите вернуть по ссылке, а не по копии, и чтобы указать, что для $myValue должна выполняться привязка ссылки, а не обычное присваивание.


PHP хранит каждую переменную в контейнере ZVAL.

Из приведенной выше ссылки:

Контейнер zval содержит, помимо типа и значения переменной, два дополнительных бита информации. Первый называется «is_ref» и представляет собой логическое значение, указывающее, является ли переменная частью «набора ссылок». С помощью этого бита движок PHP знает, как различать обычные переменные и ссылки. Поскольку PHP допускает ссылки на пользовательский интерфейс, создаваемые оператором &, контейнер zval также имеет внутренний механизм подсчета ссылок для оптимизации использования памяти. Эта вторая часть дополнительной информации, называемая "refcount", содержит количество имен переменных (также называемых символами), указывающих на этот контейнер zval.


Обратите внимание на значения переменных в выводе:
Рассмотрим следующее без & при присвоении возвращаемого значения:

$b=0;
function &func ($name) {
  global $b;
  $b = 10;
  return $b;
  }
$a = func("myname");// no & at assignment
++$a ;
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>";
xdebug_debug_zval('a'); echo "<br/>";

Вывод для приведенного выше кода:

$a= 11 $b= 10
a: (refcount=1, is_ref=0)=11 

Хотя функция возвращает значение по ссылке, это ссылка на zval-контейнер возвращаемого значения. Теперь, когда мы пытаемся присвоить возвращаемое значение (скажем, без & при присваивании), будет увеличиваться только «счетчик ссылок». Где, поскольку «is_ref» не будет изменен. Когда «переменная, в которой хранится возвращаемое значение», пытается измениться, COW (copy при записи), и создается новый контейнер zval, что делает возврат по ссылке бесполезным. Следовательно, вам также нужно будет добавить & при присвоении возвращаемого значения.

Рассмотрим следующее с & при присвоении возвращаемого значения:

$b=0;
function &func ($name) {
  global $b;
  $b = 10;
  return $b;
  }
$a =& func("myname");// & at assignment
++$a ;
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>";
xdebug_debug_zval('a'); echo "<br/>";

Выход:

$a= 11 $b= 11
a: (refcount=2, is_ref=1)=11 
person ThinkingMonkey    schedule 29.12.2011

передавать по ссылке и ссылка возврата

person Philip    schedule 29.12.2011
comment
Я проверил вашу ссылку... в ней функции определены как функция foo(&$bar){}. Я спрашиваю, почему мы ставим & перед функцией, а не перед переменной... - person Rukmi Patel; 29.12.2011
comment
Я думал, что обе ссылки могут объяснить это для вас, обратная ссылка объясняет ваш запрос - person Philip; 29.12.2011
comment
Это потому, что в foo(&$bar) { } вы будете передавать переменную по ссылке, а в &foo($bar) вы будете что-то возвращать по ссылке. - person Daniel Castro; 29.12.2011

Это означает, что функция возвращает ссылку на переменную. Подробнее об этом можно прочитать здесь: http://php.net/manual/en/language.references.php

person Daniel Castro    schedule 29.12.2011