Вызов методов подчинённых классов в родительских

Духовность™

Продвинутый новичок
Вызов методов подчинённых классов в родительских

PHP:
class Parent
{
    // Метод, который запускает ВСЕ actions сайта.
    function run()
    {
        try
        {
            if (method_exists($this, $_REQUEST['action']))
            {
                $this->$_REQUEST['action']();
            }
            else
            {
                throw new Exception('указан не верный action');
            }
        }
        catch (Exception $e)
        {
            echo 'Произошла ошибка выполнения запроса: '.$e->getMessage();
        }
    }
}

class Child extends Parent
{
    function delete(){}
    
    function update(){}
}

$_REQUEST['action'] = 'delete';

$cls = new Child();
$cls->run();
Поскольку плодить код в виде try-catch-throw не хочется в каждом методе наследуемых классов, то решил вынести этот функционал в базовый класс. Получается, что в методе базового вызываются методы подчиненого. Что "огорчило" - методы-action надо объявлять как prublic. Private тут не катит.

Не верная идеология проектирования?
 

Духовность™

Продвинутый новичок
А вот этого быть не должно.
тогда придется код плодить

а что в этом плохого?
а их никто не будет напрямую вызывать


А protected не должно разве заработать?
действительно. но почему такое поведение?... чето я запуталось
 

Ravanger

Новичок
triumvirat
но почему такое поведение?
потому, что приватные свойства и методы видны только в классе в котором они определены, и только в нем, ни в parentах, ни в childах их не будет, а protected собственно и предназначен для инкапсуляции в пределах наследования классов
 

Духовность™

Продвинутый новичок
Ravanger
ну да ну да.. туплю чето.

-~{}~ 26.11.08 15:16:

Black Raven
а команда тут мне как поможет? О_о
 

Black Raven

Новичок
а чем твой action от command отличается?

Что "огорчило" - методы-action надо объявлять как public
почему? если использовать один метод run($_REQUEST), а внутри уже логика как работать с этим массивом, то у тебя становится совершенно не важно паблик они или протектед.
 

Black Raven

Новичок
толи ты не проникся паттерном, толи я его не так понимаю, но вроде как его смысл сводится к созданию общего интерфейса, для классов, выполняющихся как команды.

PHP:
interface iCommand
{
	public function execute($request);
}

class ConcreteCommand implements iCommand
{
	public function execute($request)
	{
		//делаем всё, что надо
	}
}

class Commands implements iCommand
{
	public function execute($request)
	{
		$methodName = 'execute'.$request['action'];
		if(method_exists($this, $methodName))
		{
			return call_user_func(array(this, $methodName), $request);
		}
	}
	
	public function executeTest($request)
	{
		//тут делаем всё что надо
	}
}
 
Сверху