检查同一类中是否存在该方法。

35

所以,method_exists()需要一个对象来查看方法是否存在。但是我想知道从同一类中是否存在这个方法。

我有一个处理信息并且可以接收操作的方法,该操作会运行一个方法来进一步处理该信息。我想在调用它之前检查该方法是否存在。我该如何实现?

例如:

class Foo{
    public function bar($info, $action = null){
        //Process Info
        $this->$action();
    }
}

以下的答案都可以,只是附加一点说明:你有没有想过为什么需要查找方法是否存在?这种情况可能会出现在您从父类继承了一个方法或者您不确定当前类继承自哪个类。两种情况都可以通过使用接口或抽象方法定义来处理。使用哪种方式更透明并将错误从运行时移动到编译时,因此更可取。 - arkascha
因为我有一些其他的公共方法进一步处理这些信息并返回处理后的数据,所以第一个方法不返回任何数据,因为它可以接收仅需进行处理而不需要返回任何东西的数据。但我认为,如果需要,从第一个方法调用其他方法将节省时间,但仍然能够单独调用它们。 - Rafael
但是在类内部,为什么方法是否存在应该不清楚呢?我的意思是要么它在类中被声明实现了,要么就没有。这种情况怎么可能在运行时改变呢?我想说你非常清楚这个方法是否存在。 - arkascha
这个类中的所有其他方法都是公共的,并与第一个方法相关。但告诉我,你为什么认为它丑陋而不安全? - Rafael
但是所有其他的方法都是公共的,而且其中至少需要一个方法大部分时间返回一些东西。因此,我不明白为什么有一个自动运行其中一个方法的选项很丑陋,因为大多数情况下我不需要单独调用它们(有时我需要单独调用它们,否则它们将成为私有方法或实现在同一个方法中)。 - Rafael
显示剩余5条评论
4个回答

69

你可以像这样做:

class A{
    public function foo(){
        echo "foo";
    }

    public function bar(){
        if(method_exists($this, 'foo')){
            echo "method exists";
        }else{
            echo "method does not exist";
        }
    }
}

$obj = new A;
$obj->bar();

11

使用method_exists是正确的。但是,如果你想符合“接口隔离原则”,你可以创建一个接口来执行内省,像这样:

class A
{
    public function doA()
    {
        if ($this instanceof X) {
            $this->doX();
        }

        // statement
    }
}

interface X
{
    public function doX();
}

class B extends A implements X
{
    public function doX()
    {
        // statement
    }
}

$a = new A();
$a->doA();
// Does A::doA() only

$b = new B();
$b->doA();
// Does B::doX(), then remainder of A::doA()

@Rafael 你不是很喜欢面向对象编程吗? - Flosculus
3
我正在开始,但你却毁了它。@Flosculus - Rafael
我刚知道PHP也有接口,而且可以实现它。之前还以为只有Java能做呢,哈哈,谢谢啊。 - Jacky Supit
如果A继承B并且您无法控制B(它由第三方提供),那么这并没有帮助。 - P. Kouvarakis

6

我认为你给了我一个链接来支持你的说法,但是在手册中它说需要一个对象。我会尝试你说的,马上回来... - Rafael
为您突出显示感兴趣的部分 - Calimero
1
抱歉,我摔倒了,哈哈。 - Rafael

5
我认为最好的方法是使用__call魔术方法。
public function __call($name, $arguments)
{
    throw new Exception("Method {$name} is not supported.");
}

是的,你可以使用method_exists($this ...),但这是PHP内部的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接