【发布时间】:2013-12-05 06:56:16
【问题描述】:
我在我的项目中使用 Yii,并希望通过回调实现事件模型。我在 MySQL 中制作了“事件”模型,并希望在许多字段中存储匿名函数,例如,
**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() 期望参数 1 是一个有效的回调函数 'function(){ echo 'afterEvent of event #1 done'; }' 未找到或 无效的函数名
找到 1 个解决方案: 在代理方法 beforeEvent() 中使用 create_function 函数,如下所示:
public function beforeEvent(array $params){
$callback = create_function('$params', $this->beforeEvent);
$callback($params);
}
但在手册中说:
此函数在内部执行 eval(),因此具有相同的 eval() 等安全问题。此外,它的性能很差,而且 内存使用特性。如果您使用的是 PHP 5.3.0 或更新版本 应该使用本机匿名函数。
我们知道 eval 是邪恶的。在这种情况下如何使用匿名函数?
【问题讨论】:
-
如果不能控制输入,那是邪恶的。这里的问题是,如果有人可以访问您的数据库,他们可以在网络服务器上执行任意代码。因此,无论您找到执行该代码的任何方法,问题仍然存在。
标签: php yii anonymous-function