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

使用 isSubclassOf()ReflectionClass 方法的其他解决方案
 public function register($className, $baseAttributes) {
     $classReflection = new ReflectionClass($className);
     if($classReflection->isSubclassOf("AbstractFoo")){
          throw new InvalidArgumentException();
     }
     //....
}

关于php - 如何检查字符串是否是特定类的子类的名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39592516/

10-11 22:36
查看更多