САМОУЧИТЕЛЬ 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. Перечисляются они в соответствии со стандартным синтаксисом передачи параметров любой функции. Возвращаемое значение представляет собой уникальное имя функции, которая была сгенерирована. Вот несколько примеров:




Содержание  Назад  Вперед