当使用 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"]