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

时间:2016-09-20 11:09:00

标签: php

我想检查传递给函数的字符串是否会导致它的某个类或子类的实例。以下示例可以解决这个问题,但我正在寻找一种不需要您实例化public InetAddress intToInetAddress(int hostAddress) { byte[] addressBytes = {(byte) (0xff & hostAddress), (byte) (0xff & (hostAddress >> 8)), (byte) (0xff & (hostAddress >> 16)), (byte) (0xff & (hostAddress >> 24))}; try { return InetAddress.getByAddress(addressBytes); } catch (UnknownHostException e) { throw new AssertionError(); } } 的解决方案 - 因为我实际上并不需要它。

$className

我有另一种方法来考虑public function register($className, $baseAttributes) { $instance = new $className; if (!($instance instanceof AbstractFoo)) { throw new InvalidArgumentException(); } ... } 的实例,但是如果在配置期间向方法提供了错误的类,我想尽早失败。 例如

$className

2 个答案:

答案 0 :(得分: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();   
     }
     //....
}

使用isSubclassOf()

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

答案 1 :(得分:2)

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

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

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