当前位置: 首页 > news >正文

推荐 PHP 属性(Attributes) 简洁读取 API 扩展包

推荐 PHP 属性(Attributes) 简洁读取 API 扩展包

PHP 8.0 引入的 Attributes(属性)为类、方法、属性、常量和参数添加结构化元数据提供了便利方式。尽管概念设计合理,但读取这些属性所需的反射 API 却显得过于冗长。原本简单的一行操作,往往要写成多行样板代码。若需在某个类中查找某属性的全部使用位置,还得编写层层嵌套的循环。

Spatie 近期发布的 php-attribute-reader 包提供了一套干净的静态 API,专门解决上述问题。

使用 Attribute Reader

假设有一个携带 Route 属性的控制器,目标是获取该属性的实例。使用原生 PHP 反射的写法如下:

$reflection = new ReflectionClass(MyController::class);
$attributes = $reflection->getAttributes(Route::class, ReflectionAttribute::IS_INSTANCEOF);$route = null;
if (count($attributes) > 0) {$route = $attributes[0]->newInstance();
}

这段代码长达五行,且仍需处理属性不存在的情况。使用 php-attribute-reader 后简化为:

use Spatie\Attributes\Attributes;$route = Attributes::get(MyController::class, Route::class);

单行完成。属性不存在时返回 null,无需额外的异常处理。

读取方法属性

从方法读取属性时,原生反射的繁琐程度进一步加剧。以下示例试图获取控制器 index 方法的 Route 属性:

$reflection = new ReflectionMethod(MyController::class, 'index');
$attributes = $reflection->getAttributes(Route::class, ReflectionAttribute::IS_INSTANCEOF);$route = null;
if (count($attributes) > 0) {$route = $attributes[0]->newInstance();
}

样板代码重复出现,仅反射类有所不同。该包通过专用方法统一处理各类目标:

Attributes::onMethod(MyController::class, 'index', Route::class);
Attributes::onProperty(User::class, 'email', Column::class);
Attributes::onConstant(Status::class, 'ACTIVE', Label::class);
Attributes::onParameter(MyController::class, 'show', 'id', FromRoute::class);

全类扫描

原生反射在整类范围内查找属性时最为繁琐。假设某表单类的多个属性均携带 Validate 属性,原生 PHP 的实现大致如下:

$results = [];
$class = new ReflectionClass(MyForm::class);foreach ($class->getProperties() as $property) {foreach ($property->getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) {$results[] = ['attribute' => $attr->newInstance(), 'target' => $property];}
}foreach ($class->getMethods() as $method) {foreach ($method->getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) {$results[] = ['attribute' => $attr->newInstance(), 'target' => $method];}foreach ($method->getParameters() as $parameter) {foreach ($parameter->getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) {$results[] = ['attribute' => $attr->newInstance(), 'target' => $parameter];}}
}foreach ($class->getReflectionConstants() as $constant) {foreach ($constant->getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) {$results[] = ['attribute' => $attr->newInstance(), 'target' => $constant];}
}

对于常见的属性扫描需求,上述代码量显得过于庞大。使用该包后简化为:

$results = Attributes::find(MyForm::class, Validate::class);foreach ($results as $result) {$result->attribute; // 已实例化的属性对象$result->target;    // 反射对象$result->name;      // 例如 'email', 'handle.request'
}

所有返回的属性均为实例化对象,子类通过 IS_INSTANCEOF 自动匹配,目标不存在时返回 null 而非抛出异常。

实际应用

该包已被 Spatie 旗下的多个开源项目采用,包括 laravel-responsecachelaravel-event-sourcinglaravel-markdown,用于清理各代码库中积累属性读取相关的样板代码。

推荐 PHP 属性(Attributes) 简洁读取 API 扩展包

http://www.jsqmd.com/news/419995/

相关文章:

  • Ollama Pull慢问题优化
  • GitHub 热榜项目 - 日榜(2026-02-28)
  • Vite-Chat聊天室|vue3.5+vite7+pinia3+Vant4移动端仿微信聊天模板
  • 基于flask的高校固定资产管理系统-vue pycharm django
  • 从“vibe coding”的争论谈起:技术、管理,以及人的边界
  • CG-31紫外辐射传感器:从气象监测到医疗防护的得力助手
  • 基于flask的防盗门进销存管理系统-vue pycharm django
  • 2026年可靠的海运散杂船/散杂船物流客户信赖推荐 - 品牌宣传支持者
  • 2026年靠谱的长沙通风设备/专业通风设备如何选生产商推荐(精选) - 品牌宣传支持者
  • 基于flask的餐厅后台管理系统-vue pycharm django
  • 2026年知名的散货船代理/大连散货船价格真实参考销售厂家参考怎么选 - 品牌宣传支持者
  • 基于flask的超市进销存管理系统 供应商-vue pycharm django
  • 基于flask的大理旅游信息管理系统的设计与实现-vue pycharm django
  • esbuild打包深度解析
  • 基于flask的电影院订票系统的系统-vue pycharm django
  • 避开误区,科学择校:2026优选六大少儿英语培训机构推荐 - 品牌2025
  • 2026年评价高的潜水安全绳/电力牵引安全绳真实参考销售厂家参考怎么选 - 品牌宣传支持者
  • 基于flask的网红民宿预定管理系统-vue pycharm django
  • 聚焦适配与专业!2026优选少儿英语培训机构推荐,新手家长不踩坑 - 品牌2025
  • 科研党收藏!千笔·专业论文写作工具,好评如潮的AI论文写作软件
  • 2026 机械键盘年度优选选购指南详解 - 博客万
  • 哪个招聘平台最真实?2026实测,易直聘凭实力登顶 - 博客万
  • 基于flask+vantui的景区购票系统-vue pycharm django
  • 标准 国际标准清洁度检测选哪家?中国龙头苏州西恩士工业科技有限公司领跑行业 - 精密仪器科技圈
  • 2026年评价高的五点式安全带/胸式安全带怎么选实力工厂参考 - 品牌宣传支持者
  • 基于flask的共享自习室分享平台 自习室管理员092y06m0-vue pycharm django
  • 基于人工大猩猩部队优化CNN-LSTM(GTO-CNN-LSTM)多变量时间序列预测(Matlab代码实现)
  • 【奋飞捷报】破局高风险赛道!某制药企业斩获EcoVadis银牌评级 - 奋飞咨询ecovadis
  • OPCClient UA 客户端组件与测试程序功能说明
  • 2026知名的专利数据库厂家推荐及综合评估指南 - 品牌排行榜