使用反射 API 读取属性

要从类、方法、函数、参数、属性和类常量访问属性,反射 API 为每个相应的反射对象提供了 getAttributes() 方法。此方法返回一个 ReflectionAttribute 实例的数组,可以查询这些实例以获取属性名称、参数,并实例化表示的属性的实例。

这种将反射属性表示与实际实例分开的做法,使程序员能够更好地控制处理缺失属性类、类型错误或缺失参数的错误。只有在调用 ReflectionAttribute::newInstance() 之后,才会实例化属性类的对象,并验证参数的正确匹配,而不是更早。

示例 #1 使用反射 API 读取属性

<?php

#[Attribute]
class
MyAttribute
{
public
$value;

public function
__construct($value)
{
$this->value = $value;
}
}

#[
MyAttribute(value: 1234)]
class
Thing
{
}

function
dumpAttributeData($reflection) {
$attributes = $reflection->getAttributes();

foreach (
$attributes as $attribute) {
var_dump($attribute->getName());
var_dump($attribute->getArguments());
var_dump($attribute->newInstance());
}
}

dumpAttributeData(new ReflectionClass(Thing::class));
/*
string(11) "MyAttribute"
array(1) {
["value"]=>
int(1234)
}
object(MyAttribute)#3 (1) {
["value"]=>
int(1234)
}
*/

除了迭代反射实例上的所有属性外,还可以通过将要搜索的属性类名作为参数传递来检索特定属性类别的属性。

示例 #2 使用反射 API 读取特定属性

<?php

function dumpMyAttributeData($reflection) {
$attributes = $reflection->getAttributes(MyAttribute::class);

foreach (
$attributes as $attribute) {
var_dump($attribute->getName());
var_dump($attribute->getArguments());
var_dump($attribute->newInstance());
}
}

dumpMyAttributeData(new ReflectionClass(Thing::class));
添加笔记

用户贡献笔记 1 个笔记

5
Hirusha Sharma
3 年前
从函数中获取属性

----------------------------------------
带有属性的函数定义
----------------------------------------
#[ReadOnly]
#[Property(type: 'function', name: 'Hello')]
function Hello()
{
return "Hello";
}

-----------------------------------------
从函数中收集属性
-----------------------------------------
function getAttributes(Reflector $reflection)
{
$attributes = $reflection->getAttributes();
$result = [];
foreach ($attributes as $attribute)
{
$result[$attribute->getName()] = $attribute->getArguments();
}
return $result;
}

$reflection = new ReflectionFunction("Hello");
print_r(getAttributes($reflection));

-----------------------------
输出
-----------------------------
数组
(
[ReadOnly] => 数组
(
)

[Property] => 数组
(
[type] => function
[name] => Hello
)

)
To Top