我试图将ACL修改为模板而不使模板知道类定义中的ACL对象。以下代码生成未定义的方法Template :: isAllowed
这是为什么? TIA!
class ACL {
protected $allowed = array('anything');
public function isAllowed($what){
if(in_array($what, $this->allowed))
return true;
return false;
}
}
class Template extends stdClass { }
$Template = new Template;
$ACL = new ACL;
$Template->isAllowed = function($what) use($ACL) { return $ACL->isAllowed($what); };
if($Template->isAllowed('anything'))
echo 1;
else
echo 2;
答案 0 :(得分:3)
此:
$Template->isAllowed('anything')
实际上告诉PHP调用方法Template::isAllowed()
,这显然不存在你的致命错误所给出的。
通过为属性分配闭包,您不能将Template::isAllowed()
视为真正的方法。但是,您仍然可以调用分配给$Template->isAllowed
属性的闭包(这是Closure
的实例)。要做到这一点,您需要将属性分配给变量,然后调用:
$isAllowed = $Template->isAllowed;
if ($isAllowed('anything'))
echo 1;
else
echo 2;
或使用call_user_func()
:
if (call_user_func($Template->isAllowed, 'anything'))
echo 1;
else
echo 2;
答案 1 :(得分:0)
简单地说这不起作用 - 你不能在PHP中动态添加类方法。这在define a closure as method from class等地讨论过。