如何检查字符串是否是特定类的子类的名称


How can I check if a string is the name of a sub class of a specific class?

我想检查传递给函数的字符串是否会导致它的某个类或子类的实例。下面的例子可以做到这一点,但我正在寻找一个不需要实例化$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();   
    }
    ...
}

好吧,您需要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();   
     }
     //....
}

使用ReflectionClassisSubclassOf()方法的其他解决方案

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

请参阅http://php.net/is_subclass_of.

如果AbstractFoo确实是abstract,那么您实际上可以跳过第一次相等性检查,因为它永远不会是真的。