Возврат ссылок

Возврат по ссылке приносит пользу, когда определить переменную, к которой требуется привязать ссылку, нужно через функцию. Возвратом по ссылке не пользуются для повышения производительности. Ядро 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

?>
Пример установит значение свойству объекта, ссылку на которое вернул метод getValue, а не копии свойства, как было бы без синтаксиса ссылок.

Замечание: Передача аргумента по ссылке отличается от возврата по ссылке тем, что для возврата по ссылке знак & придётся указать в двух местах — чтобы указать, что требуется возврат ссылки на свойство, а не копии свойства, и чтобы указать, что переменную $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'); не сработает, а выдаст фатальную ошибку.