【问题标题】:php get interface methodsphp获取接口方法
【发布时间】:2013-07-08 12:01:42
【问题描述】:

是否可以获取已实现接口的方法?

例如,只返回接口中的函数 bar()。

interface iFoo  
{   
  public function bar(); 
}

class Foo implements iFoo 
{   
  public function bar()
  { 
    ...
  }

  public function fooBar()
  {
    ...
  }
}


我知道我可以使用 class_implements 来返回实现的接口,例如

print_r(class_implements('Foo'));

output:
Array ( [iFoo] => iFoo ) 

如何获取已实现接口的方法?

【问题讨论】:

    标签: php class interface


    【解决方案1】:

    根据定义,实现接口意味着您必须在子类中定义ALL 方法,因此您要查找的是接口中的ALL 方法。

    单一界面:

    $interface = class_implements('Foo');
    $methods_implemented = get_class_methods(array_shift($interface));
    var_dump($methods_implemented);
    

    输出:

    array (size=1)
      0 => string 'bar' (length=3)
    

    多个接口:

    $interfaces = class_implements('Foo');
    
    $methods_implemented = array();
    foreach($interfaces as $interface) {
        $methods_implemented = array_merge($methods_implemented, get_class_methods($interface));
    }
    var_dump($methods_implemented);
    

    输出:

    array (size=2)
      0 => string 'bar' (length=3)
      1 => string 'ubar' (length=4)
    

    为您的示例添加了接口 uFoo

    interface uFoo {
        public function ubar();
    }
    
    interface iFoo  
    {   
      public function bar(); 
    }
    
    class Foo implements iFoo, uFoo
    {   
      public function bar()
      { 
      }
    
      public function fooBar()
      {
      }
      public function ubar(){}
    }
    

    【讨论】:

    • 很好的答案,但是 $interface[key($interface)]??您可以通过 current($interface) 或 array_shift($interface)... 获取该元素
    【解决方案2】:

    你可以使用Reflection:

    $iFooRef = new ReflectionClass('iFoo');
    $methods = $iFooRef->getMethods();
    print_r( $methods);
    

    哪些输出:

    Array
    (
        [0] => ReflectionMethod Object
            (
                [name] => bar
                [class] => iFoo
            )
    )
    

    如果你想在Foo 对象上调用iFoo ref 中定义的方法,你可以这样做:

    // Optional: Make sure Foo implements iFooRef
    $fooRef = new ReflectionClass('Foo');
    if( !$fooRef->implementsInterface('iFoo')) {
        throw new Exception("Foo must implement iFoo");
    }
    
    // Now invoke iFoo methods on Foo object
    $foo = new Foo;
    foreach( $iFooRef->getMethods() as $method) {
        call_user_func( array( $foo, $method->name));
    }
    

    【讨论】:

      【解决方案3】:

      您无需拥有接口的具体实现即可知道已知接口实现应具有的方法。同样的ReflectionClass 可以做到这一点:

      interface ExampleInterface
      {
          public function foo();
          public function bar();
      }
      
      $reflection = new ReflectionClass(ExampleInterface::class);
      
      var_dump($reflection->isInterface());
      
      $methods = $reflection->getMethods();
      
      var_dump($methods[0]);
      

      Outputs:

      bool(true)
      object(ReflectionMethod)#2 (2) {
        ["name"]=>
        string(3) "foo"
        ["class"]=>
        string(16) "ExampleInterface"
      }
      

      另外,不出所料,get_class_methods 可以很好地用于接口:

      get_class_methods(ExampleInterface::class);
      // returns ['foo', 'bar']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        相关资源
        最近更新 更多