2013-07-10 55 views
0

是否可以獲得已實現的接口的方法?php獲取接口方法

例如,只返回接口中的函數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) 

我怎樣才能把實現的接口的方法呢?

回答

0

根據定義,實現一個接口意味着您必須在子類中定義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(){} 
} 
+2

很好的答案,但$接口[鍵($接口)?您可以通過當前($ interface)或array_shift($ interface)獲取該元素... – ivanhoe

3

您可以使用Reflection

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

,輸出:

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

如果你想調用iFoo裁判定義的Foo對象的方法,你可以這樣做:

// 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)); 
}