Давайте рассмотрим механизм, при помощи которого функции передаются ее аргументы. Пусть, например, у нас есть такая программа:
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.