Как мы уже знаем, функция может иметь несколько параметров, заданных по умолчанию. Они перечисляются справа налево, и их всегда фиксированное количество. Однако иногда такая схема нас устроить не может. Например, пусть мы захотели написать функцию в стиле echo, т. е., функцию, которая принимает один или более параметров (сколько именно — неизвестно на этапе определения функции). Пусть она должна вывести эти параметры "лесенкой" — каждый следующий на новой строке с отступом от предыдущего (согласен, пример немного надуман, но все же вполне подходит для иллюстрации функций с переменным количеством параметров). Вот как мы можем это сделать (листинг 11.6):
Листинг 11.6. Переменное число параметров функции
function myecho()
{ for($i=0; $i<func_num_args(); $i++) {
for($j=0; $j<$i; $j++) echo " "; // выводим отступ
echo func_get_arg($i)."<br>\n"; // выводим элемент
}
}
// отображаем строки "лесенкой"
myecho("Меркурий", "Венера", "Земля", "Марс");
Обратите внимание на то, что при описании 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<br>\n";
@$i++;
}
}
// выводим строки "лесенкой"
myecho("Меркурий", "Венера", "Земля", "Марс");
Мы используем здесь цикл foreach
для перебора аргументов, а также оператор отключения ошибок @, чтобы PHP не "ругался" на то, что переменная $i не определена при первом "обороте"
цикла.