ReflectionClass :: IS_IMPLICIT_ABSTRACT用于什么?

时间:2015-02-09 14:06:05

标签: php reflection

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

我尝试通过一些简单的类和接口的试错来解决它,并使用ReflectionClass :: getModifiers()方法来查看发生了什么,但是我不理解getModifiers方法的结果。使用以下接口,getModifiers的结果是int(144):

interface Animal {
  public function isYellow();
}

$a = new ReflectionClass("Animal");
var_dump($a->getModifiers());

修改器常量分别为16,32和64,我不知道该方法如何返回144?我是否误解了某个位域如何工作或者为什么我得到了这个结果?

更新: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类会抛出一个致命的错误,但仍会定义该类。反射马并调用getModifiers导致int(524304),其具有隐式抽象位集。但另一组的含义是什么意思呢?

反映Predator类并调用getModifiers结果为int(524336),它同时设置了隐式和显式抽象位。最后一个设置位与Horse类相同。

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

2 个答案:

答案 0 :(得分:0)

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

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

例如,如果位public的值为1且位static的值为2,则它们一起为1 | 2(按位或),即为3.并且您&# 39; d为公共静态类返回3。这可以用于类及其方法。

答案 1 :(得分:0)

内部使用的其他修饰符可能没有公开定义的常量值,因此值不一致:

使用

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_ *常量,这些常量具有一系列附加值,这些附加值可能与反射相关,也可能不相关但可能仍适用于类