Создание динамической функции на PHP
Одной из весьма интересных возможностей PHP является создание функций прямо при выполнении PHP-кода. Давайте разберём, как создаются динамические функции в PHP, на примерах.
Занимается этим функция create_function(), которая принимает параметры функции и её тело.
<?php
$sqr = create_function('$x', 'return $x * $x;');
echo $sqr(3); // Выведется 9
?>
Всё достаточно прозрачно, однако, обратите внимание, что и аргументы функции, и тело функции необходимо писать в одинарных кавычках. Либо если нужно подставлять в тело значения некоторых переменных, то использовать двойные, но экранировать там, где подстановка значения не нужна.
Применяется функция create_function() редко, единственное разумное применение, которое приходит на ум - это использование её при пользовательской сортировке:
<?php
$array = array("php", "functions", "create", "mysql"); // Создаём массив
usort($array, create_function('$x, $y', 'return strlen($x)-strlen($y);')); // Сортируем строки по длине
print_r($array); // Выводим массив
?>
Такая запись значительно короче, чем если бы мы отдельно создавали функцию сортировки. Однако, функция create_function() работает очень медленно. Если бы мы при сортировке создали отдельную функцию заранее, то данный скрипт работал бы в 2.5 раза быстрее. Поэтому если нет необходимости создавать динамические функции в PHP, то не делайте этого.
-
- Михаил Русаков
Комментарии (5):
В случае сортировки сработает и безымянная функция: usort($array, function($x, $y) {return strlen($x)-strlen($y)})
Ответить
Не лучше ли сделать так usort($array,function($x,$y ){return strlen($x)-strlen($y)});
Ответить
Можно и так, но create_function() можно поместить в переменную, а затем при многократной сортировке достаточно будет подставлять эту переменную, не придётся каждый раз определять функцию сортировки заново.
Ответить
тогда так $func=function($x,$y ){return strlen($x)-strlen($y)}; usort($array,$func);
Ответить
Это уже не генерация функций, а её прямое создание. Поскольку тело функции уже не строка, которую можно легко менять значениями переменных (пришедших, например, от пользователя), а самый обычный PHP-код. Если именно генерировать функции при сортировке, то можно попросить пользователя написать в форме некое правило сортировки, а затем легко это правило воплотить в жизнь, сгенерировав функцию. И в данном случае без create_function() уже не обойтись.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.