Возврат по ссылке приносит пользу, когда определить переменную, к которой требуется привязать ссылку, нужно через функцию. Возвратом по ссылке не пользуются для повышения производительности. Ядро PHP само оптимизирует производительность. Ссылки возвращают только по веским техническим причинам. Ссылки возвращает следующий синтаксис:
<?php
class Foo
{
public $value = 42;
public function &getValue()
{
return $this->value;
}
}
$obj = new Foo();
$myValue = &$obj->getValue(); // Переменная $myValue — ссылка на переменную $obj->value, значение которой равно 42
$obj->value = 2;
echo $myValue; // Выводит новое значение свойства $obj->value — 2
?>
Замечание: Передача аргумента по ссылке отличается от возврата по ссылке тем, что для возврата по ссылке знак
&
придётся указать в двух местах — чтобы указать, что требуется возврат ссылки на свойство, а не копии свойства, и чтобы указать, что переменную $myValue требуется связать со ссылкой, а не присвоить переменной значение стандартным способом.
Замечание: Возврат ссылки из функции синтаксисом:
return ($this->value);
не сработает, поскольку по ссылке возвращается результат выражения, а не переменная. По ссылке разрешается возвращать только переменные и больше ничего.
Чтобы использовать ссылку, которую вернула функция, потребуется присвоить ссылку переменной:
<?php
function &collector()
{
static $collection = array();
return $collection;
}
$collection = &collector();
// Переменная $collection стала ссылкой на статический массив внутри функции
$collection[] = 'foo';
print_r(collector());
// Array
// (
// [0] => foo
// )
?>
Ссылку, которую вернула одна функция, передают в другую функцию, которая принимает ссылку, следующим синтаксисом:Замечание: При присваивании без символа
&
в выражении наподобие$collection = collector();
переменная $collection получит копию значения, а не ссылку, которую вернула функция.
<?php
function &collector()
{
static $collection = array();
return $collection;
}
array_push(collector(), 'foo');
?>
Замечание: Обратите внимание, что вызов
array_push(&collector(), 'foo');
не сработает, а выдаст фатальную ошибку.