【问题标题】:Check if method exists in the same class检查方法是否存在于同一个类中
【发布时间】:2026-01-06 20:50:02
【问题描述】:

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

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

例子:

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

【问题讨论】:

  • 下面的答案都很好,只是补充一句:你有没有问过自己为什么你需要找出方法是否存在?如果您有一个从父类继承的方法,或者如果您不确定当前类继承自什么,则可能会出现这种情况。这两种情况都可以通过使用接口或抽象方法定义来处理。哪个更透明,并将错误从运行时转移到编译时,因此更可取。
  • 因为我还有其他一些公开的方法,并进一步处理该信息并返回处理后的数据,所以第一个方法不返回,因为它可以接收只需要处理的数据,而不是需要返回任何东西。但我认为如果需要从第一个方法调用另一个方法会节省时间,但仍然可以单独调用它们。
  • 但是在类本身内部,为什么要不清楚方法是否存在?我的意思是它在类中声明/实现的,或者不是。在运行时如何以及为什么要改变?我会说您确切知道该方法是否存在。
  • 因为$action可以接收到一个不存在的方法名。
  • 啊,您通过将其名称作为字符串传递来指定方法。确实,非常丑陋和不安全......

标签: php class methods exists


【解决方案1】:

method_exists() 接受类名或对象实例作为参数。所以你可以检查$this

http://php.net/manual/en/function.method-exists.php

参数

对象 对象实例或类名

方法名 方法名

【讨论】:

  • 我想你给了我一个手册的链接来支持你所说的,但在手册中它说它需要一个对象。我会试试你说的,一会儿回来......
  • 为您突出显示上面有趣的部分
  • 噢,(脸埋在地里),对不起=p
【解决方案2】:

你可以这样做:

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();

【讨论】:

    【解决方案3】:

    使用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 你不只是喜欢 OOP。
    • 我开始了,但你杀了它@Flosculus
    • 我只知道 PHP 有一个接口,你可以实现它。以为我们只能在 java 中做到这一点,哈哈。谢谢老兄
    • 如果 A 扩展 B 并且您无法控制 B(它由第 3 方提供),那将无济于事
    【解决方案4】:

    我认为最好的方法是使用 __call 魔术方法。

    public function __call($name, $arguments)
    {
        throw new Exception("Method {$name} is not supported.");
    }
    

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

    【讨论】:

      最近更新 更多