Как упоминает @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