Как вызвать свой метод по имени?

Balkon

Новичок
Как вызвать свой метод по имени?

Есть класс предок:

PHP:
class Predok
{
    public function DoAction($action)
    {
        if(!method_exists($this, "Do".$action."Action")) $action = "view";
        // тут надо как-то вызвать метод Do.$action.Action класса. как?
    }
}
и класс наследник

PHP:
class Naslednik extends Predok
{
    private function DoViewAction() { ... }
    private function DoSomethingAction() { ... }
}
и runner

PHP:
    $action = GetAction();
    $naslednik = new Naslednik();
    $naslednik->DoAction($action);
Вот собственно и вопрос. Как вызвать метод класса если известно только его имя?
switch не хочу писать ибо наследников много и у них разные actions

-~{}~ 27.09.06 13:52:

Че-та затупил, сорри

PHP:
 $temp = "Do".$action."Action";
 $this->$temp();
 

Balkon

Новичок
Хм... мой вариант не заработал...

Fatal error: Call to private method Naslednik::DoviewAction() from context 'Predok'

только непонятно почему из контекста "Predok"?
Я же вроде как вызываю метод DoAction у Naslednik'a

-~{}~ 27.09.06 14:18:

Объясните мне плиз природу этой ошибки.
Что я не так сделал? Почему пхп мне говорит что я не из своего класса Naslednik пытаюсь вызвать эти методы?

var_dump($this) показывает object(Naslednik) { ... }

так почему же я тогда не могу вызвать cвои private методы?
 

whirlwind

TDD infected, paranoid
>только непонятно почему из контекста "Predok"
Потому что DoAction у тебя в Predok, а private - область действия текущий класс.

Могу посоветовать экшены сделать экземплярами.

PHP:
interface IAction {
   function doAction();
}

class Predoc {
    private $_map = Array();

   function addAction(IAction $handle,$action){
      $this->_map[$action] = $handle;
   }

   function doAction($action){
      if ( !isset($this->_map[$action]) )
         throw new Exception(...);
       $this->_map[$action]->doAction();
   }
}

class ViewAction  implements IAction {
    function doAction(){
        ...
    }
}


$ctrl = new Predoc();
$ctrl->addAction(new ViewAction,"view");
$ctrl->doAction("view");
PS. сори за каламбур. случайно запостил раньше времени.
 

Balkon

Новичок
ну так я ж наследуюсь от предка.
значит и в моем Naslednike есть этот метод.
var_dump выводит же правильное название класса (в методе Predok)
 

Balkon

Новичок
почему тогда

public function DoAction($action)
{
var_dump($this);
$this->DoViewAction();
}

выводит Naslednik?
а след. строчка DoViewAction() вызывает ошибку из-за private?
 

whirlwind

TDD infected, paranoid
я уже объяснил выше. наследование - не означает копирование методов. оно означает перегрузку методов. это разные вещи.
 
Сверху