2016-09-20 74 views
3

我想檢查傳遞給函數的字符串是否會導致某個類或其子類的實例。下面的例子是訣竅,但我正在尋找一個解決方案,不需要您實例化$className--因爲我實際上並不需要它。如何檢查字符串是否是特定類的子類的名稱?

public function register($className, $baseAttributes) { 
    $instance = new $className; 
    if (!($instance instanceof AbstractFoo)) { 
     throw new InvalidArgumentException(); 
    } 
    ... 
} 

我有一個因素$className情況下,另一種方法,但我想盡早如果配置過程中錯誤的類已經提供的方法失敗。 例如像

public function register($className, $baseAttributes) { 
    if (!($className classof AbstractFoo)) { 
     throw new InvalidArgumentException(); 
    } 
    ... 
} 
+0

[ReflectionClass](http://www.php.net/manual/en/class.reflectionclass.php) –

+1

檢查它是否實現了某個接口,而不是'is或擴展某個類「? – Sejanus

+0

是$ className的完全限定名嗎? –

回答

4

那麼,你需要Reflection,和兩個方法getParentClass() & isAbstract()

下面是您需要的一個工作示例。

public function register($className, $baseAttributes) { 

    $classReflection = new ReflectionClass($className); 
    $parentClassName = $classReflection->getParentClass()->getName(); 
    if($parentClassName=="AbstractFoo"){ 
      throw new InvalidArgumentException(); 
    } 

    $parentReflection = new ReflectionClass($parentClassName); 

    $isAbstract= $parentReflection->isAbstract(); // return true of false 
    if (!($isAbstract)) { 
      throw new InvalidArgumentException(); 
    } 
    //.... 
} 

使用的ReflectionClass

public function register($className, $baseAttributes) { 
    $classReflection = new ReflectionClass($className); 
    if($classReflection->isSubclassOf("AbstractFoo")){ 
      throw new InvalidArgumentException(); 
    } 
    //.... 
} 
+0

@PaulCrovella,是的權利......謝謝:) –

+0

@PaulCrovella,我已經根據你的建議添加了 –

2
if ($className == 'AbstractFoo' || is_subclass_of($className, 'AbstractFoo')) … 

isSubclassOf()方法見http://php.net/is_subclass_of其它解決方案。

如果AbstractFoo確實是abstract實際上您可以跳過第一次相等性檢查,因爲它永遠不會成立。

+0

問題是'is_subclass_of'需要實例作爲第一個參數,而不是字符串。 – ddinchev

+0

呃......你有沒有閱讀過文檔? – deceze

+0

對不起,我讀了第一個例子和描述,其實在底部有一個額外的例子,表明它可以接受一個字符串。 Upvoted :) – ddinchev

相關問題