我想检查传递给函数的字符串是否会导致它的某个类或子类的实例。下面的例子可以做到这一点,但我正在寻找一个不需要实例化$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();
}
//....
}
使用ReflectionClass
的isSubclassOf()
方法的其他解决方案
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
,那么您实际上可以跳过第一次相等性检查,因为它永远不会是真的。