ReflectionClass::IS_IMPLICIT_ABSTRACT有什么用?
What is ReflectionClass::IS_IMPLICIT_ABSTRACT used for?
我正在尝试理解 PHP ReflectionClass,但遇到了一些麻烦。在文档中列出了 classes 的 3 个修饰符:隐式抽象、显式抽象和 final,常量值分别为 16、32 和 64。我想知道隐式和显式抽象修饰符是如何工作的?什么时候是 PHP class 隐式摘要?
我试图通过一些简单的 classes 和接口通过反复试验来解决这个问题,并使用 ReflectionClass::getModifiers() 方法来查看发生了什么,但是我不明白结果getModifiers 方法。使用以下接口,getModifiers 的结果是 int(144):
interface Animal {
public function isYellow();
}
$a = new ReflectionClass("Animal");
var_dump($a->getModifiers());
随着修饰符常量分别为 16、32 和 64,我完全不明白该方法如何 return 144?我是不是误解了位域的工作原理或者为什么会得到这个结果?
更新:144 因为位是 10010000,所以设置的位是 16 和 128。使接口隐式抽象。不过我想知道128是什么意思?
我用 classes 做了一些测试:
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 class 抛出一个致命错误但仍然定义 class。反映 Horse 并调用 getModifiers 产生 int(524304),它具有隐式抽象位集。但是另一个设置位是什么意思?
反映 Predator class 并调用 getModifiers 生成 int(524336),它同时设置了隐式和显式抽象位。最后设置的位与 Horse class.
相同
Fish class 被声明为抽象的,但没有抽象方法。 getModifiers 结果是 int(524320),正如预期的那样,它设置了显式抽象位,但没有设置隐式抽象位。
方法getModifiers()
用于确定为class(或接口或特征)定义的class修饰符。
它returns是一个int,代表不同位的设置。
例如,如果位 public
的值为 1,而位 static
的值为 2,那么它们加起来就是 1 | 2
(按位或),即 3。而你d 为 class 返回 3,即 public 静态。这可以用于 class 及其方法。
内部可能使用了其他修饰符,它们根本没有公开定义的常量值,因此存在值差异:
正在使用
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_* 常量,这些常量具有一系列附加值,这些值可能与反射相关,也可能不相关,但可能仍适用于 类
我正在尝试理解 PHP ReflectionClass,但遇到了一些麻烦。在文档中列出了 classes 的 3 个修饰符:隐式抽象、显式抽象和 final,常量值分别为 16、32 和 64。我想知道隐式和显式抽象修饰符是如何工作的?什么时候是 PHP class 隐式摘要?
我试图通过一些简单的 classes 和接口通过反复试验来解决这个问题,并使用 ReflectionClass::getModifiers() 方法来查看发生了什么,但是我不明白结果getModifiers 方法。使用以下接口,getModifiers 的结果是 int(144):
interface Animal {
public function isYellow();
}
$a = new ReflectionClass("Animal");
var_dump($a->getModifiers());
随着修饰符常量分别为 16、32 和 64,我完全不明白该方法如何 return 144?我是不是误解了位域的工作原理或者为什么会得到这个结果?
更新:144 因为位是 10010000,所以设置的位是 16 和 128。使接口隐式抽象。不过我想知道128是什么意思?
我用 classes 做了一些测试:
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 class 抛出一个致命错误但仍然定义 class。反映 Horse 并调用 getModifiers 产生 int(524304),它具有隐式抽象位集。但是另一个设置位是什么意思?
反映 Predator class 并调用 getModifiers 生成 int(524336),它同时设置了隐式和显式抽象位。最后设置的位与 Horse class.
相同Fish class 被声明为抽象的,但没有抽象方法。 getModifiers 结果是 int(524320),正如预期的那样,它设置了显式抽象位,但没有设置隐式抽象位。
方法getModifiers()
用于确定为class(或接口或特征)定义的class修饰符。
它returns是一个int,代表不同位的设置。
例如,如果位 public
的值为 1,而位 static
的值为 2,那么它们加起来就是 1 | 2
(按位或),即 3。而你d 为 class 返回 3,即 public 静态。这可以用于 class 及其方法。
内部可能使用了其他修饰符,它们根本没有公开定义的常量值,因此存在值差异:
正在使用
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_* 常量,这些常量具有一系列附加值,这些值可能与反射相关,也可能不相关,但可能仍适用于 类