|
ySqrt($n)
{ return $n*$n;
}
echo MySqrt(4); // выводит 16
Сразу несколько значений функции, разумеется, возвратить не могут. Однако, если
это все же очень нужно, то можно вернуть ассоциативный массив или же список,
на-
пример так (листинг 11.3):
Листинг 11.3. Возвращение массива
function Silly()
{ return array(1,2,3);
}
// присваивает массиву значение array(1,2,3)
$arr=Silly();
// присваивает переменным $a, $b, $c первые значения из списка
list($a,$b,$c)=Silly();
В этом примере использован оператор list(), который мы уже рассматривали.
Если функция не возвращает никакого значения, т. е. инструкции return в ней нет,
то считается, что функция возвратила ложь (то есть, false). Все же часто лучше
вер-
нуть false явно (если только функция не объявлена как процедура, или
void-функция
по Си-терминологии), например, задействуя return false, потому что это несколь-
ко яснее.
Часть III. Основы языка PHP 186
Параметры по умолчанию
Часто бывают такие случаи, что у некоторой разрабатываемой функции должно быть
довольно много параметров, причем некоторые из них будут задаваться совершенно
единообразно. Например, мы пишем функцию для сортировки массива. Тогда, кроме
очевидного параметра — массива — хотелось бы также задавать и второй параметр,
который бы указывал: сортировать ли в убывающем или в возрастающем порядке.
При этом, скажем, мы знаем, что чаще всего придется сортировать в порядке
убыва-
ния. В этом случае мы можем оформить нашу функцию так:
function MySort(&$Arr, $NeedLoOrder=1)
{ ... сортируем в зависимости от $NeedLoOrder...
}
Теперь, имея такую функцию, можно написать в программе:
MySort($my_array,0); // сортирует в порядке возрастания
MySort($my_array); // второй аргумент задается по умолчанию!
То есть, мы можем уже вообще опустить второй параметр у нашей функции, что бу-
дет выглядеть так, как будто мы его задали равным 1. Как видно, значение по
умол-
чанию для какого-то аргумента указывается справа от него через знак равенства.
За-
метьте, что значения аргументов по умолчанию должны определяться справа налево,
причем недопустимо, чтобы после любого из таких аргументов шел обычный "не-
умолчальный" аргумент. Вот, например, неверное описание:
// Ошибка!
function MySort($NeedLoOrder=1, &$Arr)
{
... сортируем в зависимости от $NeedLoOrder...
}
MySort(,$my_array); // Ошибка! Это вам не Бейсик!
Передача параметров по ссылке
Давайте рассмотрим механизм, при помощи которого функции передаются ее аргу-
менты. Пусть, например, у нас есть такая программа:
function Test($a)
{ echo "$a\n";
$a++;
echo "$a\n";
}
. . .
$num=10;
Test($num);
Глава 11. Функции и области видимости 187
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!
Такой способ передачи параметров исторически на
|
|