САМОУЧИТЕЛЬ PHP 4

Генерация функций


В последнем примере мы рассмотрели, как можно создать 100 функций с разными именами, написав программу длиной в 2 строчки. Это, конечно, впечатляет, но мы должны жестко задавать имена функций. Почему бы не поручить эту работу PHP, если нас не особо интересуют получающиеся имена?

Листинг 24.2. Генерация "анонимных" функций

$Funcs=array();

for($i=0; $i<=100; $i++) {

  $id=uniqid("F");

  eval("function $id() { return $i*$i; }");

  $Funcs[]=$id;

}

Теперь мы имеем список $Funcs, который содержит имена наших сгенерированных функций. Как нам вызвать какую-либо из них? Это очень просто:

echo $Funcs[12]();  // âûâîäèò 144

Однако мы могли бы написать с тем же результатом и

echo Func12();

при том условии, если бы воспользовались кодом генерации функций из листинга 24.1. Кажется, что так короче? Тогда не торопитесь. Все хорошо, если мы точно знаем, что надо вызвать 12-ю функцию, но как же быть, если номер хранится в переменной — например, в $n? Вот решение:



echo $Funcs[$n]();  // âûâîäèò ðåçóëüòàò ðàáîòû $n-é ôóíêöèè

Не правда ли, просто? Выглядит явно лучше, чем такой код:

$F="Func$n";

$F();

Тут нам не удастся обойтись без временной переменной $F (вариант с дополнительной eval() тоже не подойдет, т. к. у функции могут быть строковые параметры, и придется перед всеми кавычками ставить слэши, чтобы поместить их в параметр функции eval().

Оказывается, в PHP версии 4 существует функция, которая поможет нам упростить генерацию "анонимных"

функций, подобных полученным в примере из листинга 24.2. Называется она create_function().

string create_function(string $args, string $code)

Создает функцию с уникальным именем, выполняющую действия, заданные в коде $code (это строка, содержащая программу на PHP). Созданная функция будет принимать параметры, перечисленные в $args. Перечисляются они в соответствии со стандартным синтаксисом передачи параметров любой функции. Возвращаемое значение представляет собой уникальное имя функции, которая была сгенерирована. Вот несколько примеров:


$Mul=create_function('$a,$b', 'return $a*$b;');

$Neg=create_function('$a', 'return -$a;');

echo $Mul(10,20);  // выводит 200

echo $Neg(2);      // выводит -2



Не пропустите последнюю точку с запятой в конце строки, переданной вторым параметром create_function()!

Давайте теперь перепишем наш пример из листинга 24.2 с учетом create_function(). Это довольно несложно. Обратите внимание, насколько сократился код.

$Funcs=array();

for($i=0; $i<=100; $i++)

  $Funcs[]=create_function("","return $i*$i;");

echo $Funcs[12]();  // выводит 144

И последний пример применения анонимных функций — в программах сортировки с использованием пользовательских функций:

$a=array("orange", "apple", "apricot", "lemon");

usort($a,create_function('$a,$b', 'return strcmp($a,$b);'));

foreach($a as $key=>$value) echo "$key: $value<br>\n";


Содержание раздела