ReflectionClass::getProperties()返回属性是否遵循声明顺序?
能否依赖ReflectionClass::getProperties()的属性排序特性?
绝对不建议依赖这个特性,原因很简单:PHP官方文档从来没承诺过getProperties()会按属性声明顺序返回结果。
虽然在当前大多数PHP版本里,它确实会顺着声明顺序输出,但这只是内核实现的“巧合”,属于未被规范的细节。哪天PHP内核做优化调整,或者你换了个带特殊配置的环境,这个顺序很可能就乱了——而你的文件格式对顺序要求极高,到时候出问题根本难排查。
给你两个靠谱的替代方案,能稳稳控制字段顺序:
- 用自定义属性标记顺序:写一个简单的属性类,给每个字段标注它的顺序值,反射读取后按这个值排序。示例代码:
#[Attribute(Attribute::TARGET_PROPERTY)] class FieldOrder { public function __construct(public int $order) {} } class MyFileFormat { #[FieldOrder(1)] public int $one; #[FieldOrder(2)] public int $two; #[FieldOrder(3)] public int $three; } $rc = new ReflectionClass(MyFileFormat::class); $properties = []; foreach ($rc->getProperties() as $property) { $attr = $property->getAttributes(FieldOrder::class)[0] ?? null; if ($attr) { $order = $attr->newInstance()->order; $properties[$order] = $property->getName(); } } ksort($properties); foreach ($properties as $name) { echo $name . "\n"; } - 直接在类里定义顺序数组:比如加个静态数组
public static array $fieldOrder = ['one', 'two', 'three'];,处理属性时直接按这个数组的顺序来,简单直观,可读性还强。
总之,别赌实现细节,用显式的方式把顺序定死才是稳妥的做法。
内容的提问来源于stack exchange,提问作者yolenoyer
相关产品推荐
相关产品推荐

