2016-06-13 147 views
0

現有項目我的工作,我們有以下的情況:PHP檢查是否實際類實現接口

interface A { } 

class B implements A { } 

class C extends B { } 

class D extends B implements A { } 

$B = new B(); 
$C = new C(); 
$D = new D(); 

什麼是要弄清楚,如果實際的類實現接口的正確方法A而不僅僅是父類?支票應該返回真實爲$ B和$ D和爲$ C.通常情況下,你會這樣做

if($C instanceof A) { //do the work } 

但在我們的情況下,這將返回true,不應該。

一種方法可以是解析文件並測試該類是否真正實現了A與token_get_all函數。但在這之前,我想問問是否有更優雅的解決方案。

我知道這聽起來很奇怪,但情況是如此,並且類層次結構無法更改。任何見解都會有所幫助。

+0

如果B實現了A,那麼所有擴展B的類都不會自動實現A嗎? – Guiroux

+0

是的,但我只需要實際具有實現A語句的類。給出層次結構是因爲它是一箇舊的遺留系統。 – Laoneo

+0

'但我只需要實際具有實現語句的類'你能解釋一下這個問題而不用深入解釋嗎? – Guiroux

回答

0

只有在接口A不通過父類擴展的情況下,此函數才返回true。

echo checkimplements($B, "A"); //Returns True 

function checkimplements($class, $interfacename) 
{ 
    $ownInterfaces = class_implements($class); 
    $parent = get_parent_class($class); 
    if($parent) { 
     $parentInterfaces = class_implements($parent); 
    } else { 
     $parentInterfaces = array(); 
    } 
    $diff = array_diff($ownInterfaces, $parentInterfaces); 
    $found = in_array($interfacename, $diff); 
    return $found; 
} 
+0

但是它也返回false。 – Laoneo

相關問題