PHP-4 Эффективная работа


Вызов функций по имени
Работа со списком аргументов
Проверка наличия определений функций
Регистрация специальных функций

В этой главе описываются функции, позволяющие применить пользовательские функции к структурам данных, а также использовать другие трюки, заимствованные РНР из мира Лиспа.

9.1. Вызов функций по имени

9.1.1. Вызов функции: call_user_func_array

mixed call_user_func_array (string function_name [, array paramarr] )

Осуществляет вызов функции, введенной пользователем по ее имени function_name, с передачей ей параметров через массив paramarr. Например:

function debug($var, $vaд) {
       echo "***Контрольная печать\nПеременная: $vаr\пЗначение:";
       if (is_array($val) || is_object($val) || is_resource($val))
          print_r($val);
       else
          echo "\n$val\n";
       echo "***\n";
}
$c = mysql_connect();
$host = $HTTP_SERVER_VARS["SERVER_NAME"];

call_user_func_array ('debug', array("host", $host));
call_user_func_array ('debug', array(("c", $c));
call_user_func_array ('debug', array("HTTP_POST_VARS", $HTTP_POST_VARS));

9.1.2. Вызов функции по имени: call_user_func

mixed call_user_func (string function_name
[, mixed parameter
[, mixed ...]])

Вызывает определенную пользователем функцию, имя которой передается как параметр function_name. Используется следующим образом:

function barber ($type) {
print «Вы выбрали прическу <b>$type</b>»;
}
call_user_func ("barber", «ежик»);
call_user_func ("barber", «под военного");

9.1.3. Создание ^-функции: create_f unction

string create_function (string args, string code)

Создает анонимную функцию по переданным ей параметрам и возвращает ее уникальное имя. Как правило, аргументы передаются в виде строки, заключенной в одиночные кавычки, что запрещает интерпретацию содержащихся в ней двойных кавычек и имен переменных, и тот же самый подход рекомендуется использовать для кода. В противном случае вам придется закрывать Esc-кодами любой встретившийся символ $, которых обычно в PHP-программе достаточно!

Функция используется для динамической генерации пользовательской функции «на лету» исходя из информации, получаемой во время исполнения программы. Это довольно обычная практика для Лиспа, но в большинстве других языков подобные методы встречаются достаточно редко.

Вы можете использовать функцию create_function, например, вот так:
<HTML>
<ТIТLЕ>Создание лямбда-функции</ТITLЕ>
<BODY BGCOLOR="#FFFFFF">
<FONT SIZE=+1>
<?
$newfunc = create_function('$a,$b','return
               "ln($a) + ln($b) = ".log($a * Sb); ');
echo "Создана анонимная функция:<p><b> $newfunc</b> - \n";
echo $newfunc(2,M_E)."\n";
?>

При выполнении эта программа выведет на печать имя функции, которое от запуска к запуску программы может принимать различные значения (вернее, изменяется номер функции), и результат ее работы (рис. 9.1).

Рис. 9.1. Первая попытка определения анонимной ^.-функции

9.2. Работа со списком аргументов

Вторая группа функций, предназначенных для облегчения работы программиста при написании собственной библиотеки функций, ориентирована на работу со списком аргументов. Наибольший практический эффект от этих функций достигается при работе со списками аргументов переменной длины, но, как вы увидите из примеров, эти механизмы могут оказаться полезными и в других ситуациях.

9.2.1. Считать аргумент из списка параметров:func_get_arg

mixed func_get_arg (int arg_num)

Функция возвращает аргумент функции, который находится на позиции arg_num в списке аргументов пользовательской функции. Отсчет позиции начинается с нуля. При вызове за пределами определения пользовательской функции func_get_arg() генерирует предупреждение.

( Если аргумент a rg_num больше, чем количество переданных функции аргументов, также генерируется предупреждение, а функция возвращает false. Вот как можно использовать эту функцию:
<?php
function foo() {
       $numargs = func_num_args();
       echo "Всего аргументов: $numargs<br>\n";
       if ($numargs >= 2) {        echo "Второй аргумент: " . func_get_arg (1) . "
\n";
       }
} foo (1, 2, 3);
?>

9.2.2. Считывание массива аргументов:func_get_args

array func_get_args ()

Функция возвращает массив, в котором каждый элемент является соответствующим аргументом из списка параметров функции. Если func_get_args() вызывается вне пределов определения функции, она генерирует предупреждение:

<ТIТLЕ>Работа со списком параметров</ТIТLЕ>
<BODY BGCOLOR="FFFFFF">
<FONT SIZE=+1>
<?php
function foo() {
       $numargs = func_num_args();
       echo "Всего аргументов: $numargs<br>\n";
       if ($numargs >= 2) {
       echo "Второй аргумент функции: ".func_get_arg (1).
       "<br>\n";
       }
       echo "Список аргументов функции<р>";
       $arg_list = func_get_args();
       for ($i = 0; $i < $numargs; $i++) {
       echo "Аргумент $i равен: " . $arg_list[$i] . "<br>\n";
       <}
}
foo (1, 2, 3);
?>
Результат выполнения этой программы приведен на рис. 9.2.
Рис. 9.2. Использование func_get_args позволяет эффективно обрабатывать списки аргументов переменной длины

9.2.3. Количество аргументов функции:func_num_args

int func_num_args ()

Функция возвращает количество аргументов, переданных функции пользователя, внутри определения которой произведен ее вызов. Вызов func_num_args() вне пределов пользовательской функции приведет к генерации предупреждения:

<?php
function foo() {
       $numargs = func_num_args();
       echo "Количество аргументов: $numargs\n";
}
foo (1, 2, 3) ;
?>
назад
далее

Сайт управляется системой uCoz