2

我有以下类结构:

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 内部调用,但这闻起来很糟糕。

有任何想法吗?

4

3 回答 3

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!");
    }
}
于 2011-09-26T20:03:34.560 回答
2

如果“几个”意味着 3 或 4,我可能会做类似的事情:

protected function processThis()
{
  return $this->processThings();
}

protected function processThat()
{
  return $this->processThings();
}

protected function processThings()
{
  //common function
}

当然,有重复的代码,但它的作用是立即有意义的。有一些函数可以做类似的事情,很容易发现。

于 2011-09-26T20:07:44.940 回答
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
    }
}

根据您问题中的描述,这应该是合适的,但我并不完全确定。

于 2011-09-26T21:35:29.280 回答