我有以下类结构:
class Parent
{
public function process($action)
{
// i.e. processCreateMyEntity
$this->{'process' . $action};
}
}
class Child extends Parent
{
protected function processCreateMyEntity
{
echo 'kiss my indecisive ass';
}
}
我需要在Child类中编写一些统一的方法来处理几个非常类似的创建实体的操作。我无法更改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方法的开头调用了一个hack方法调用,它通过debug_backtrace检查这个方法是在Parent :: process中调用的,但这闻起来很糟糕。
有什么想法吗?
答案 0 :(得分:2)
我假设您的孩子从父母延伸。
然后你可以做的是:
public function process($action)
{
$methods = get_class_methods($this);
$action = 'process' . $action;
if(in_array($action, $methods)){
$this->{$action}()
}
else {
die("ERROR! $action doesn't exist!");
}
}
答案 1 :(得分:2)
如果'几个'意味着3或4,我可能会做类似的事情:
protected function processThis()
{
return $this->processThings();
}
protected function processThat()
{
return $this->processThings();
}
protected function processThings()
{
//common function
}
当然,有重复的代码,但它的作用立竿见影。有一些功能可以做类似的事情,而且很容易发现它。
答案 2 :(得分:0)
实际上,您不需要__call
,您可以创建自己的和受保护的:
class Parent
{
public function process($action)
{
// i.e. processCreateMyEntity
$this->entityCall('process' . $action);
}
}
class Child extends Parent
{
protected function entityCall($methodName, $args)
{
$entityName = $this->parseEntityNameFromMethodCalled($methodName);
// some actions common for a lot of entities
}
}
根据你问题中的描述,这个应该适合,但我不完全确定。