Запретить вызов метода экземпляра X из контекста! = Y - PullRequest
0 голосов
/ 08 апреля 2010

Это сложный вопрос.

Я "эмулирую" ZF Bootstrapping (внешний вид поверхности).Не спрашивайте меня почему, называйте это академическим интересом.Итак, у меня есть Bootstrap Abstract с методом «run», который перебирает себя, чтобы найти любые методы с префиксом «init».

Приложение ищет определенный пользователем класс, который расширяет этот класс, в котором пользователь может определить любое количество методов таким способом.Тем не менее, я хочу запретить пользователю выполнять команду «run» своего родительского класса, в то же время предоставляя ту же команду для клиентского кода.

class Bootstrap_Abstract{
    protected final function run(){
    // if method exists that starts 'init' - execute the method
    }

}

class Bootstrap extends Bootstrap_Abstract(){
    public function initSomething(){
    //do something
    }

    //PREVENT THIS
    public function initRun(){
        $this->run();
    }

}

//application code, not exposed to user - changes in behaviour require changes in this code directly
 class Application(){
     $Bootstrap = new Bootstrap();//load user bootstrap
     $Bootstrap->run();
 }

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

Чтобы определить, «что» вызвало конкретный метод, посмотрите на debug_backtrace

0 голосов
/ 09 апреля 2010

Post Script: проблема с моим оригинальным кодом была ошибка в дизайне. Ответственность за перебор методов Bootstrap должна была быть возложена на вызывающий класс, а не на сам целевой класс. Я решил эту проблему, переместив функцию в invoker. Забавно, насколько очевиден / прост рефакторинг в ретроспективе ...

...