Я использую Yii в своем проекте и хочу реализовать модель события с обратными вызовами. Я сделал модель «Event» в MySQL и хочу хранить анонимные функции во многих областях, например,Вызов анонимной функции из db
**Event model in Yii**
id - int
name - varchar(255)
beforeEvent - text
В «afterEvent» поле сохраненной функции:
function(){echo 'afterEvent #1';}
Тогда Принести все события и попробовать вызов функция «afterEvent»:
$events = Event::model()->findAll();
foreach ($events as $event)
{
$event->beforeEvent();
}
Как я не этот метод в модели Event, я сделал метод прокси
public function beforeEvent() { call_user_func($this->beforeEvent); }
Проблема в ошибке:
call_user_func() expects parameter 1 to be a valid callback, function 'function(){ echo 'afterEvent of event #1 done'; }' not found or invalid function name
Найдено 1 Раствор: в прокси-метода BeforeEvent() использовать create_function функцию следующим образом:
public function beforeEvent(array $params){
$callback = create_function('$params', $this->beforeEvent);
$callback($params);
}
, но в руководстве сказано:
This function internally performs an eval() and as such has the same security issues as eval(). Additionally it has bad performance and memory usage characteristics. If you are using PHP 5.3.0 or newer a native anonymous function should be used instead.
и мы знаем, что eval - это зло. Как я могу использовать анонимную функцию в этой ситуации?
Это зло, если вы не можете управлять входом.Проблема здесь в том, что если кто-то получает доступ к вашей базе данных, они могут выполнять произвольный код на веб-сервере. Поэтому, независимо от способа выполнения этого кода, проблема все равно будет существовать. –