11.4. Пользовательские функции
Эти функции поддерживают создание и использование пользовательских функций. value call_user_func(string function, ...)
Функция call_user_func (листинг 11.78) используется для выполнения функции, определенной пользователем. Имя функции задается аргументом function, за которым следуют передаваемые функции аргументы. Это позволяет определить функцию, которая будет вызываться при выполнении.
Этой функцией можно воспользоваться, если необходимо вызвать метод или объект. Для этого следует передать в качестве имени функции массив. Первым элементом массива должно быть имя класса или объекта, вторым элементом - имя метода.
Данные
value call_user_func_array(string function, array parameters)
Эта функция аналогична функции call_user_func, за исключением того, что она принимает параметры в виде массива.
string create_function(string arguments, string code)
Функция create_function создает функцию и возвращает уникальное имя. Такие функции называются анонимными. Это позволяет создавать функции, зависящие от информации, которая становится известной при выполнении. Хотя имя этой новой функции можно сохранить в переменной и вызвать ее позднее, функция create_function, вероятнее, более полезная для создания простейших функций обратного вызова лямбда-стиля. В листинге 11.79 эта идея демонстрируется на практике.
eval(string phpcode)
Функция eval (листинг 11.80) делает попытку выполнить строку, указанную в аргументе phpcode, как строку PHP-сценария. Как и при любой другой работе со строками, двойные кавычки приведут к проверке на вложенные строки и другие специальные символы. Поэтому можно прибегнуть к использованию одинарных кавычек или символов доллара с обратной косой чертой. 
Листинг 11.79. Функция create_function

<?php
$data = array('carrot', 'apple', 'banana');
//добавить символ подчеркивания к метке конца и перевести все буквы в верхний регистр
array_walk($data, create_function('&$v',
'$v = "_" . strtoupper($v) . "_";'));
print_r($data);
?>

В некоторых аспектах функция eval аналогична функции include или require. Но, кроме очевидных различий, eval работает со строками вместо файлов и сразу же начинает работать в режиме обработки PHP-кода. Если необходимо перейти в режим передачи простого HTML-кода, браузеру потребуется вставить закрывающий PHP-тег (?>). Почему может потребоваться выполнение функции eval в строке, которая содержит чистый HTML-код? Вероятнее всего, это может случиться при хранении кода в базе данных.
Будьте очень внимательны, работая с функцией eval и любой строкой, содержащей данные, получаемые с помощью переменных. Это также справедливо и для полей баз данных, которые обычно вводятся с помощью форм. По возможности вместо функции используйте вложенные операторы $.

| Листинг 11.80. Функция eval_
<?php
//Моделирование использования функции eval // с данными из базы данных
$code_from_database = '<b><?php print(date("Y-m-d")); ?></b>'; eval("?>" . $code_from_database);
?>

value func_get_arg(integer argument)
Функция func_get_arg (листинг 11.81) позволяет получить количество переданных пользовательской функцией аргументов. Первый аргумент имеет нулевой номер. Это позволяет создавать функции, которые могут принимать любое количество аргументов. Возвращаемое значение может иметь любой тип, соответствующий типу выбираемого аргумента. Функция func_num_args возвращает количество имеющихся аргументов.
В главе 4, "Функции", обсуждаются функции, включая функции, принимающие неограниченное количество аргументов.
Листинг 11.81. Функция func_get_arg

<?php
/*
** Функция concat
** Ввод: любое количество строк
** Вывод: строка
** Описание: вводимые строки располагаются вместе ** по порядку и возвращаются одной строкой.
*/
func_get_arg and func_num_args. function concat()
{
//начать с пустой строки
$data = "";
//просмотреть все аргументы for($i=0; $i < func_num_args();
{
// добавить возвращаемому значению текущий аргумент $data .= func_get_arg($i);
}
return($data);
}
// распечатать "OneTwoThree" print(concat("One", "Two", "Three"));
?>