САМОУЧИТЕЛЬ PHP 4

Возврат функцией ссылки


До сих пор я рассматривал лишь функции, которые возвращают определенные значения— а именно, копии величин, использованных в инструкции return. Заметьте, это были именно копии, а не сами объекты. Например:

$a=100;

function R()

{ global $a; // объявляет $a глобальной

  return $a; // возвращает значение, а не ссылку!

}

$b=R();

$b=0;    // присваивает $b, а не $a!

echo $a; // âûâîäèò 100

В то же время мы бы хотели, чтобы функция R()

возвращала не величину, а ссылку на переменную $a, чтобы в дальнейшем с этой ссылкой можно было работать точно так же, как и с $a. Например, это может очень пригодиться в объектно-ориентированном программировании на PHP (основы которого мы рассмотрим в пятой части книги), когда функция должна возвращать именно объект, а не его копию.

Как же нам добиться нужного результата? Использование оператора $b=&R(), к сожалению, не подходит, т. к. при этом мы получим в $b

ссылку не на $a, а на ее копию. Если задействовать return &$a, то появится сообщение о синтаксической ошибке (PHP воспринимает & только в правой части оператора присваивания сразу после знака =). Но выход есть. Воспользуемся специальным синтаксисом описания функции, возвращающей ссылку (листинг 11.15):



Листинг 11.15. Возвращение ссылки

$a=100;

function &R() // & — возвращает ссылку

{ global $a;  // объявляет $a глобальной

  return $a;  // возвращает значение, а не ссылку!

}

$b=&R(); // не забудьте & !!!

$b=0;    // присваивает переменной $a!

echo $a; // выводит 0. Это значит, что теперь $b — синоним $a

Как видим, нужно поставить &

в двух местах: перед определением имени функции, а также в правой части оператора присваивания при вызове функции. Использовать амперсанд в инструкции return не нужно.

Лично я не нахожу такой синтаксис удобным. Достаточно по-ошибке всего один раз пропустить &

при вызове функции, как переменной $b

будет присвоена не ссылка на $a, а только ее копия со всеми вытекающими из этого последствиями. При использовании объектно-ориентированного программирования это может породить логические ошибки, выглядящие крайне странно. Поэтому я рекомендую применять возврат ссылки как можно реже, и только в тех случаях, когда это действительно необходимо.



Содержание раздела