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