Закрытие PHP для члена класса после создания экземпляра дает неопределенный метод

Я пытаюсь взломать ACL в шаблоне, не сообщая шаблону об объекте ACL в определении класса. Следующий код генерирует неопределенный метод Template::isAllowed

Почему это? ТИА!



        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;

person Spechal    schedule 13.02.2011    source источник


Ответы (2)


Этот:

$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;
person BoltClock    schedule 13.02.2011

Просто это не работает - вы не можете динамически добавлять методы класса в PHP, и точка. Это обсуждалось в таких местах, как определить замыкание как метод из класса.

person chx    schedule 13.02.2011