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