ReflectionClass::is_IMPLICIT_ABSTRACT用于什么


What is ReflectionClass::IS_IMPLICIT_ABSTRACT used for?

我试图理解PHP ReflectionClass,但遇到了一些问题。在文档中列出了类的3个修饰符:隐式抽象、显式抽象和final,分别为常量值16、32和64。我想知道的是隐式和显式抽象修饰符是如何工作的?PHP类什么时候是隐式抽象?

我试着用几个简单的类和接口反复尝试,并使用ReflectionClass::getModifiers()方法来查看发生了什么,但我不理解getModifier方法的结果。使用以下接口,getModifiers的结果为int(144):

interface Animal {
  public function isYellow();
}
$a = new ReflectionClass("Animal");
var_dump($a->getModifiers());

修改器常数分别为16、32和64,我不明白这个方法怎么会返回144?我是否误解了比特场的工作原理,或者为什么我会得到这个结果?

UPDATE:144作为位是10010000,所以设置的位是16和128。使接口隐式抽象。我想知道128是什么意思?

我用类做了一些测试:

class Horse implements Animal {
  public function hasTail() { return true; }
}
abstract class Predator implements Animal {
  public function hasTeeth() { return true; }
}
abstract class Fish implements Animal {
  public function isYellow() { return true; }
}

Horse类抛出一个致命错误,但仍然定义该类。反射Horse并调用getModifiers会得到int(524304),它具有隐式抽象位集。但另一组比特是什么意思?

反射Predator类并调用getModifiers会得到int(524336),它同时具有隐式和显式抽象位集。最后一个设置位与Horse类的设置位相同。

Fish类被声明为抽象的,但没有抽象方法。然后,getModifiers的结果是int(524320),正如预期的那样,其具有显式抽象位集合,但不具有隐式抽象位。

内部可能使用了额外的修饰符,这些修饰符没有公开定义的常数值,因此值存在差异:

使用

if ($a->getModifiers() & ReflectionClass::IS_IMPLICIT_ABSTRACT)
    echo 'IS_IMPLICIT_ABSTRACT',PHP_EOL;
if ($a->getModifiers() & ReflectionClass::IS_EXPLICIT_ABSTRACT)
    echo 'IS_EXPLICIT_ABSTRACT',PHP_EOL;
if ($a->getModifiers() & ReflectionClass::IS_FINAL) 
    echo 'IS_FINAL',PHP_EOL;

将确定哪些定义的修改器应用

查看反射源代码可以发现以下定义:

REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_IMPLICIT_ABSTRACT", ZEND_ACC_IMPLICIT_ABSTRACT_CLASS);
REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_EXPLICIT_ABSTRACT", ZEND_ACC_EXPLICIT_ABSTRACT_CLASS);
REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_FINAL", ZEND_ACC_FINAL_CLASS);

因此,所有标志都基于内部定义的ZEND_ACC_*常量,这些常量具有一系列附加值,这些值可能与反射相关,也可能与反射无关,但可能仍然适用于类

方法getModifiers()用于确定为类(或接口或特征)定义的类修饰符。

它返回的是一个int,表示设置的不同位。

例如,如果比特public具有值1,并且比特static具有值2,那么它们一起将是1 | 2(逐位OR),即3。对于一个公共静态类,你会得到3。这可以用于类及其方法。