当使用 getAttributes() 方法根据父类获取属性时,正确的标志常量是 ReflectionAttribute::IS_INSTANCEOF(正如 sergiolibe 提到的那样,等于 2)。
<?php
$reflectionClass->getAttributes(SomeParentAttribute::class, ReflectionAttribute::IS_INSTANCEOF);
?>
(PHP 8)
ReflectionClass::getAttributes — 获取属性
将此类上声明的所有属性作为 ReflectionAttribute 数组返回。
name
过滤结果,仅包含与该类名匹配的属性的 ReflectionAttribute 实例。
flags
如果提供了 name
,则用于确定如何过滤结果的标志。
默认为 0
,这将只返回与类 name
匹配的属性的结果。
唯一可用的其他选项是使用 ReflectionAttribute::IS_INSTANCEOF
,这将改为使用 instanceof
进行过滤。
属性数组,作为 ReflectionAttribute 对象。
示例 #1 基本用法
<?php
#[Attribute]
class Fruit {
}
#[Attribute]
class Red {
}
#[Fruit]
#[Red]
class Apple {
}
$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes();
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>
以上示例将输出
Array ( [0] => Fruit [1] => Red )
示例 #2 按类名过滤结果
<?php
#[Attribute]
class Fruit {
}
#[Attribute]
class Red {
}
#[Fruit]
#[Red]
class Apple {
}
$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes('Fruit');
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>
以上示例将输出
Array ( [0] => Fruit )
示例 #3 按类名过滤结果,包含继承
<?php
interface Color {
}
#[Attribute]
class Fruit {
}
#[Attribute]
class Red implements Color {
}
#[Fruit]
#[Red]
class Apple {
}
$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes(Color::class, ReflectionAttribute::IS_INSTANCEOF);
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>
以上示例将输出
Array ( [0] => Red )
当使用 getAttributes() 方法根据父类获取属性时,正确的标志常量是 ReflectionAttribute::IS_INSTANCEOF(正如 sergiolibe 提到的那样,等于 2)。
<?php
$reflectionClass->getAttributes(SomeParentAttribute::class, ReflectionAttribute::IS_INSTANCEOF);
?>
当使用带有特定属性类和标志的 getAttributes() 时,标志 0 将只返回与指定类匹配的属性,而标志 2 将返回与指定类及其子类匹配的属性。
<?php
#[Attribute(\Attribute::TARGET_CLASS)]
class SomeAttribute {}
#[Attribute(\Attribute::TARGET_CLASS)]
class ChildAttribute extends SomeAttribute {}
#[SomeAttribute]
#[SomeChildAttribute]
class SomeClass {}
$rc = new ReflectionClass(SomeClass::class);
$r_atts = $rc->getAttributes(SomeAttribute::class, 0); // 0 为默认值,仅获取指定类
echo json_encode(array_map(fn(ReflectionAttribute $r_att) => $r_att->getName(), $r_atts)), PHP_EOL;
$r_atts = $rc->getAttributes(SomeAttribute::class, 2); // 获取指定类及其子类
echo json_encode(array_map(fn(ReflectionAttribute $r_att) => $r_att->getName(), $r_atts)), PHP_EOL;
?>
输出
["SomeAttribute"]
["SomeAttribute","ChildAttribute"]