Закрытие PHP для члена класса после создания дает неопределенный метод - PullRequest
0 голосов
/ 13 февраля 2011

Я пытаюсь взломать 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;

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

This:

$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;
0 голосов
/ 13 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...