3

我知道还有其他方法可以解决这个问题,但为了简单起见,我想知道是否可以执行以下操作:

   MyFactory::Create()->callMe();

和 myFactory 类:

   class MyFactory {
       private $obj;

       public static Create() { 
           $this->obj = new ClassA();
           return $this->obj;
       }

       public function __undefinedFunctionCall() {
           //function does not exist within MyFactory Class but it exists
           // in ClassA
           $this->obj->callMe();
       }
   }

所以基本上函数callMe不存在于 MyFactory 类中,但它存在于 ClassA 中。不要问我为什么不能只扩展classA,因为代码结构已经写好了,我不能修改它。我只是需要一种解决方法。

4

4 回答 4

5

你可以简单地使用method_exists

它需要2个参数method_exists ( mixed $object, string $method_name )

第一个是对象实例或类名,第二个是方法名。

所以它应该很简单:

if(method_exists($this->obj,'callMe')){
   $this->obj->callMe();
}
else{
//...throw error do some logic
}
于 2013-09-04T16:38:14.613 回答
1

感谢Mark Ba​​ker,我找到了解决方案。如果其他人有类似的问题,以下解决了它:

在我的工厂类中添加了这个函数

    public function __call($name, $arguments)
    {
            //if function exists within this class call it
        if (method_exists(self, $name))
        {
            $this->$name($arguments);
        }
        else
        {
            //otherwise check if function exists in obj and call it
            if (method_exists($this->obj, $name))
            {
                $this->obj->$name($arguments);
            }
            else 
            {
                throw new \Exception('Undefined function call.');
            }          
        }
    }
于 2013-09-04T16:45:41.467 回答
0

您正确地使用了魔术方法 __call(),但是您错误地实现了它。

  1. 您不需要检查它是否存在于自己的类中,PHP 会在内部为您执行此操作。魔术方法 __call 仅在该方法不存在时发生。
  2. 您将单个数组参数传递给 $this->obj->$name,您应该在其中分别传递每个参数。
  3. 没有任何东西被退回。

这就是您应该为您的目的实现 __call 魔术方法的方式。

public function __call($name, $arguments) {
    if(method_exists($this->obj,$name)) {
        return call_user_func_array(array($this->obj, $name), $arguments);
    } else {
        throw new Exception("Undefined method ".get_class($this)."::".$name);
    }
}
于 2014-04-23T22:01:27.553 回答
0

检查类方法是否存在:

$this->obj = new ClassA();
var_dump(method_exists($this->obj,'callMe'));

如果是静态方法:

var_dump(method_exists('ClassA','callMe'));

true如果 method_name 给定的方法已为给定对象定义,则返回,false否则返回。

php.net 手册

于 2013-09-04T16:36:06.313 回答