| |
ервая строка — совершенно ясно: она сначала считывает все
содержимое
файла $fname по строкам в список, а затем образует одну большую строку путем
"склеивания" всех элементов этого списка. Заметьте, как получилось лаконично:
нам
не нужно ни открывать файл, ни использовать функцию fread() или fgets().
Вторая строка, собственно, запускает тот код, который мы только что считали. Но
cr.le iir ddlaard.lnn. nceaierec ?> c creri.carlnn. — nyarec inedunc. c
credunc. eiar
PHP? Наверное, вы уже догадались: суть в том, что функция eval() воспринимает
свой параметр именно как код, а не как документ со вставками PHP-кода. В то же
время, считанный нами файл представляет собой обычный PHP-сценарий, т. е. доку-
мент со "вставками" PHP. Иными словами, настоящая инструкция include воспри-
нимает файл в контексте документа, а функция eval() — в контексте кода. По-
этому-то мы и используем ?> — переводим текущий контекст в режим восприятия
документа, чтобы eval() "осознала" статический текст верно. Мы еще неоднократно
столкнемся с этим приемом в будущем.
Генерация функций
В последнем примере мы рассмотрели, как можно создать 100 функций с разными
именами, написав программу длиной в 2 строчки. Это, конечно, впечатляет, но мы
должны жестко задавать имена функций. Почему бы не поручить эту работу PHP,
если нас не особо интересуют получающиеся имена?
Листинг 24.2. Генерация "анонимных" функций
$Funcs=array();
for($i=0; $i<=100; $i++) {
$id=uniqid("F");
eval("function $id() { return $i*$i; }");
$Funcs[]=$id;
}
Часть IV. Стандартные функции PHP 342
Теперь мы имеем список $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. Управление интерпретатором 343
Давайте теперь перепишем наш пример из листинга 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 \n";
Проверка синтаксической
корректности кода
С помощью create_function() можно проверить, является ли некоторая строка
верным PHP-кодом, не запуская при этом сам код. В самом деле, если со
|
|