иногда мы объявляем "&" перед функцией в кодировании на основе классов - PullRequest
2 голосов
/ 29 декабря 2011

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

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

вместо определения

function test()

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

function &test()

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

Ответы [ 3 ]

4 голосов
/ 29 декабря 2011

Как упоминает @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 возвращаемого значения.Теперь, когда мы пытаемся присвоить возвращаемое значение (скажем, без & в присваивании), увеличивается только «refcount».Где, как "is_ref" не будет изменен.Когда «переменная, в которой хранится возвращаемое значение», пытается измениться, происходит COW (копирование при записи) и создается новый контейнер 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 
2 голосов
/ 29 декабря 2011
1 голос
/ 29 декабря 2011

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

...