PHP 8.0 引入了属性——一种为类、方法、属性等添加结构化元数据的便捷方式。但是,使用原生反射 API 以编程方式读取属性却冗长且重复。 空间 PHP Attribute Reader 将该样板代码封装成一个简洁的静态 API。
例如,使用原生反射 API 读取单个类属性如下所示:
反射类
=
新的
反射类
(
后控制器
::班级
(英文):$属性
=
反射类
->
获取属性
(
路线
::班级
(英文):如果
(
数数
($属性)
>
0
){路线
=
$attributes[
0
]
->
新实例
();}
现在想象一下,对一个类的每个方法、属性、常量和参数都这样做。
安装
作曲家
要求
space/php-attribute-reader
阅读属性
该软件包公开了一个
Attributes
包含用于所有读取操作的静态方法的类。调用
get()
以目标类作为第一个参数,属性类作为第二个参数,即可检索已实例化的属性对象;
null
如果未找到:
假设我们已经定义了自己的自定义
Route
属性并在控制器中使用它:
使用
应用程序\属性\路由
;#[
路线
(
'/posts'
,
方法
:[
'得到'
])]班级
后控制器{
// ...}
我们可以使用以下方法获取或检查该属性:
使用
空间\属性\属性
;使用
应用程序\属性\路由
;路线
=
属性
::
得到
(
后控制器
::班级
,
路线
::班级
(英文):属性
::
有
(
后控制器
::班级
,
路线
::班级
(英文):
// 真或假
对于方法、属性、常量和参数,该软件包提供了专门的方法:
属性
::
onMethod
(
后控制器
::班级
,
'指数'
,
中间件
::班级
(英文):属性
::
onProperty
(
邮政
::班级
,
'标题'
,
柱子
::班级
(英文):属性
::
onConstant
(
帖子状态
::班级
,
'草稿'
,
标签
::班级
(英文):属性
::
onParameter
(
后控制器
::班级
,
'展示'
,
'slug'
,
从路线
::班级
(英文):
每个对象都返回已实例化的属性对象,或者
null
如果未找到。
查找类中的属性
Attributes::find()
一次调用即可搜索类中给定属性的所有用法——包括类定义、方法、属性、常量和参数。
所以如果我们有自己的习俗
Validate
属性并在以下类中使用它:
使用
应用程序\属性\验证
;班级
联系表格{#[
证实
(
'必填|字符串'
)]
民众
细绳
$name;#[
证实
(
'必填|电子邮件'
)]
民众
细绳
邮箱地址;#[
证实
(
'必填|字符串'
)]
民众
细绳
$message;}
这样我们就能找到所有类似的用法:
$结果
=
属性
::
寻找
(
联系表格
::班级
,
证实
::班级
(英文):foreach
(结果)
作为
$result) {$结果
->
姓名;
例如:'姓名'、'电子邮件'、'留言'$结果
->
属性;
// 已实例化的属性对象$结果
->
目标;
// 底层的 Reflection* 对象}
您也可以省略属性类名来检索类上的所有属性。该包使用
IS_INSTANCEOF
匹配,因此搜索基本属性类也会匹配子类。
PHP Attribute Reader 可以简化常见属性操作中的反射样板代码。如果您正在使用自定义 PHP 属性,那么它值得一看。您可以在这里找到源代码: GitHub 以及完整的文档 spatie.be 。






