略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: ReflectionClass::getAttributes

2024-11-14

ReflectionClass::getAttributes

(PHP 8)

ReflectionClass::getAttributesGets Attributes

说明

public ReflectionClass::getAttributes(?string $name = null, int $flags = 0): array

Returns all attributes declared on this class as an array of ReflectionAttribute.

参数

name

Filter the results to include only ReflectionAttribute instances for attributes matching this class name.

flags

Flags for determining how to filter the results, if name is provided.

Default is 0 which will only return results for attributes that are of the class name.

The only other option available, is to use ReflectionAttribute::IS_INSTANCEOF, which will instead use instanceof for filtering.

返回值

Array of attributes, as a ReflectionAttribute object.

范例

示例 #1 Basic usage

<?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 Filtering results by class name

<?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 Filtering results by class name, with inheritance

<?php
interface Color {
}

#[Attribute]
class Fruit {
}

#[Attribute]
class Red implements Colour {
}

#[Fruit]
#[Red]
class Apple {
}

$class = new ReflectionClass('Apple');
$attributes $class->getAttributes('Colour'ReflectionAttribute::IS_INSTANCEOF);
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

以上例程会输出:

Array
(
    [0] => Red
)
add a noteadd a note

User Contributed Notes 2 notes

up
2
sandrenyl at gmail dot com
6 months ago
When using the method getAttributes() to fetch attributes based on a parent class, the proper flag constant is ReflectionAttribute::IS_INSTANCEOF (which equals 2 as mentionned by sergiolibe).

<?php
$reflectionClass
->getAttributes(SomeParentAttribute::class, ReflectionAttribute::IS_INSTANCEOF);
?>
up
1
sergiolibe at gmail dot com
11 months ago
When using getAttributes() with specific attribute class and flags, flag 0 will return just matching attributes with specified class, and 2 will return matching attributes with specified class and children of that class:
<?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 is default, just given class
   
echo json_encode(array_map(fn(ReflectionAttribute $r_att) => $r_att->getName(), $r_atts)), PHP_EOL;

   
$r_atts = $rc->getAttributes(SomeAttribute::class, 2); // given class and children classes
   
echo json_encode(array_map(fn(ReflectionAttribute $r_att) => $r_att->getName(), $r_atts)), PHP_EOL;
?>

output:
["SomeAttribute"]
["SomeAttribute","ChildAttribute"]

官方地址:https://www.php.net/manual/en/reflectionclass.getattributes.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3