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

Передача параметров по ссылке


Давайте рассмотрим механизм, при помощи которого функции передаются ее аргументы. Пусть, например, у нас есть такая программа:

function Test($a)

{ echo "$a\n";

  $a++;

  echo "$a\n";

}

. . .

$num=10;

Test($num);

echo $num;

Что происходит перед началом работы функции Test()

(которая, кстати, не возвращает никакого значения, т.е. является в чистом виде подпрограммой или процедурой) — как выражаются программисты на Паскале? Все начинается с того, что создается переменная $a, локальная для данной функции (про локальные переменные мы поговорим позже), и ей присваивается значение 10 (то, что было в $num). После этого значение 10 выводится на экран, величина $a

инкрементируется, и новое значение (11) опять печатается. Так как тело функции закончилось, происходит возврат в вызвавшую программу. А теперь вопрос: что будет напечатано при последующем выводе переменной $num?



А напечатано будет 10 (и это несмотря на то, что в переменной $a

до возврата из функции было 11!) Ясно, почему это происходит: ведь $a — лишь копия $num,

а изменение копии, конечно, никак не отражается на оригинале.

В то же время, если мы хотим, чтобы функция имела доступ не к величине, а именно к самой переменной

(переданной ей в параметрах), достаточно при передаче аргумента функции перед его именем поставить & (листинг 11.4):

Листинг 11.4. Передача параметров по ссылке (первый способ)

function Test($a)

{ echo "$a\n";

  $a++;

  echo "$a\n";

}

$num=10;      // $num=10

Test(&$num);  // à òåïåðü $num=11!

echo $num;    // âûâîäèò 11!

Такой способ передачи параметров исторически называется "передачей по ссылке", в этом случае аргумент не является копией переменной, а "ссы­лается"

на нее. Во второй главе мы уже имели дело со ссылками. Вы можете заметить, что передача параметра по ссылке полностью соответствует синтаксису задания ссылочной переменной в PHP.


Чтобы не забывать каждый раз писать & перед переменной, передавая ее функции, существует и другой, более привычный для программистов на Си++ синтаксис передачи по ссылке. А именно, можно символ & перенести прямо в заголовок функции, вот так (листинг 11.5):

Листинг 11.5. Передача параметров по ссылке (второй способ)

function Test(&$a)

{ echo "$a\n";

  $a++;

  echo "$a\n";

}

....

$num=10;      // $num=10

Test($num);   // à òåïåðü $num=11!

echo $num;    // âûâîäèò 11!

Советую вам, если вы абсолютно точно уверены в необходимости передачи параметра именно по ссылке, использовать именно этот синтаксис, т. к. он значительно более "прозрачен"

и, к тому же, убережет вас от множества ошибок, связанных с пропуском & в программе.



Теперь, если вы в программе запустите функцию Test(), передав ей в параметрах не переменную (или ячейку массива), а непосредственное значение (например, константу 100), это у вас не получится: PHP выведет сообщение об ошибке. Таким образом, в качестве параметров, передаваемых по ссылке, можно задавать только переменные, но не непосредственные значения.


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