我试图了解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),正如预期的那样,它具有显式的抽象位,但不是隐式的抽象位。
答案 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_ *常量,这些常量具有一系列附加值,这些附加值可能与反射相关,也可能不相关但可能仍适用于类