У меня следующая структура класса:
class Parent
{
public function process($action)
{
// i.e. processCreateMyEntity
$this->{'process' . $action};
}
}
class Child extends Parent
{
protected function processCreateMyEntity
{
echo 'kiss my indecisive ass';
}
}
Мне нужно написать некоторый унифицированный метод в дочернем классе, чтобы обработать несколько очень похожих действий для создания сущностей. Я не могу изменить Parent :: process, и мне нужно, чтобы эти методы вызывались из него.
Первое, что приходит на ум, - это магический метод __call. Имя сущности анализируется из первого аргумента __call. Таким образом, структура превращается в:
class Parent
{
public function process($action)
{
// i.e. processCreateMyEntity
$this->{'process' . $action};
}
}
class Child extends Parent
{
protected function __call($methodName, $args)
{
$entityName = $this->parseEntityNameFromMethodCalled($methodName);
// some actions common for a lot of entities
}
}
Но дело в том, что __call нельзя защитить так, как мне нужно. Я поместил взломать метод вызова в начале метода __call, который проверяет через debug_backtrace, что этот метод вызывался внутри Parent :: process, но это плохо пахнет.
Есть идеи?