|
ывается "передачей по ссылке",
в
этом случае аргумент не является копией переменной, а "ссылается" на нее. Во
вто-
рой главе мы уже имели дело со ссылками. Вы можете заметить, что передача пара-
метра по ссылке полностью соответствует синтаксису задания ссылочной переменной
в PHP.
Чтобы не забывать каждый раз писать & перед переменной, передавая ее функции,
существует и другой, более привычный для программистов на Си++ синтаксис пере-
дачи по ссылке. А именно, можно символ & перенести прямо в заголовок функции,
вот так (листинг 11.5):
Листинг 11.5. Передача параметров по ссылке (второй способ)
function Test(&$a)
{ echo "$a\n";
Часть III. Основы языка PHP 188
$a++;
echo "$a\n";
}
....
$num=10; // $num=10
Test($num); // а теперь $num=11!
echo $num; // выводит 11!
Советую вам, если вы абсолютно точно уверены в необходимости передачи парамет-
ра именно по ссылке, использовать именно этот синтаксис, т. к. он значительно
более
"прозрачен" и, к тому же, убережет вас от множества ошибок, связанных с
пропуском
& в программе.
Теперь, если вы в программе запустите функцию Test(), передав ей в пара-
метрах не переменную (или ячейку массива), а непосредственное значение
(например, константу 100), это у вас не получится: PHP выведет сообщение об
ошибке. Таким образом, в качестве параметров, передаваемых по ссылке,
можно задавать только переменные, но не непосредственные значения.
Переменное число параметров
Как мы уже знаем, функция может иметь несколько параметров, заданных по умол-
чанию. Они перечисляются справа налево, и их всегда фиксированное количество.
Однако иногда такая схема нас устроить не может. Например, пусть мы захотели
на-
писать функцию в стиле echo, т. е., функцию, которая принимает один или более
параметров (сколько именно — неизвестно на этапе определения функции). Пусть
она должна вывести эти параметры "лесенкой" — каждый следующий на новой стро-
ке с отступом от предыдущего (согласен, пример немного надуман, но все же
вполне
подходит для иллюстрации функций с переменным количеством параметров). Вот как
мы можем это сделать (листинг 11.6):
Листинг 11.6. Переменное число параметров функции
function myecho()
{ for($i=0; $i\n"; // выводим элемент
}
}
// отображаем строки "лесенкой"
myecho("Меркурий", "Венера", "Земля", "Марс");
Глава 11. Функции и области видимости 189
Обратите внимание на то, что при описании myecho() мы указали пустые скобки в
качестве списка параметров, словно функция не получает ни одного параметра. На
самом деле в PHP при вызове функции можно указывать параметров больше, чем
задано в списке аргументов — в этом случае никакие предупреждения не выводятся
(но если фактическое число параметров меньше, чем указано в описании, PHP
выдаст
сообщение об ошибке). "Лишние" параметры как бы игнорируются, в результате пус-
тые скобки в myecho() позволяют нам в действительности передать ей сколько
угод-
но параметров.
Для того чтобы все же иметь доступ к "проигнорированным" параметрам, существу-
ют три встроенные в PHP функции, которые я сейчас подробно опишу.
r int func_num_args()
Возвращает общее число аргументов, переданных функции при вызове.
r mixed func_get_arg(int $num)
Возвращает значение аргумента с номером $num, заданного при вызове функции.
Нумерация, как всегда, отсчитывается с нуля.
r list func_get_args()
Возвращает список всех аргументов, указанных при вызове функции. Думаю, что
применение этой функции оказывается практически всегда удобнее, чем первых
двух.
Перепишем наш пример с применением последней функции (листинг 11.7):
Листинг 11.7. Использование fuct_get_args()
function myecho()
{ foreach(func_get_args() as $v) {
for($j=0; $j<@$i; $j++) echo " ";
echo "$v \n";
@$i++;
}
}
// выводим строки "лесенкой"
myecho("Меркурий", "Венера", "Земля", "Марс");
Мы используем здесь цикл foreach для перебора аргументов, а также оператор от-
ключения ошибок @, чтобы PHP не "ругался" на то, что переменная $i не
определена
при первом "обороте" цикла.
Часть III. Ос
|
|