实例化后,类成员上的PHP闭包会产生未定义的方法

时间:2011-02-13 06:43:12

标签: php acl php-5.3 anonymous-function

我试图将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;

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等地讨论过。