Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
ервая строка — совершенно ясно: она сначала считывает все 
содержимое 
файла $fname по строкам в список, а затем образует одну большую строку путем 
"склеивания" всех элементов этого списка. Заметьте, как получилось лаконично: 
нам 
не нужно ни открывать файл, ни использовать функцию fread() или fgets(). 
Вторая строка, собственно, запускает тот код, который мы только что считали. Но 

cr.le iir ddlaard.lnn. nceaierec ?> c creri.carlnn.  — переводим текущий контекст в режим восприятия 
документа, чтобы 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-кодом, не запуская при этом сам код. В самом деле, если со
 
<<-[Весь Текст]
Страница: из 287
 <<-