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

简介: Spatie推出的`php-attribute-reader`包,极大简化PHP 8.0+ Attributes的读取操作:单行获取类/方法/属性/参数/常量上的指定属性,自动实例化、安全返回null,避免冗长反射样板代码,已应用于多个知名Laravel项目。

推荐 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 扩展包

目录
相关文章
|
4月前
|
机器学习/深度学习 数据采集 并行计算
基于YOLOv8的脑肿瘤识别(中英文双版) | 附完整源码与效果演示
脑肿瘤是严重威胁人类健康的疾病之一,其早期准确诊断对患者的治疗和预后至关重要。传统的脑肿瘤诊断主要依赖放射科医生的经验,通过CT、MRI等医学影像进行人工判读。然而,这种方法存在主观性强、工作量大、易受疲劳影响等问题。随着深度学习技术的快速发展,基于计算机视觉的医学影像分析为脑肿瘤的自动识别提供了新的解决方案。
|
4月前
|
弹性计算 人工智能 数据库
2026年阿里云优惠活动解读:学生、个人开发和企业用户最新优惠参考
2026年阿里云推出全覆盖优惠:学生享300元无门槛券;个人开发者可抢38元/年轻量服务器或99元/年ECS;企业获最高10万元抵扣金及5亿元迁云出海补贴;新用户享飞天免费试用(最长12个月)。普惠上云,降本增效!
954 2
|
4月前
|
人工智能 自然语言处理 搜索推荐
站内Geo优化SOP:专家于磊“两大核心+四轮驱动”实战指南
在AI驱动的搜索时代,站内Geo优化已成为企业获取高质量流量和建立品牌信任的关键。
316 9
|
4月前
|
人工智能 安全 API
Qoder+Skills,一个人一周完成开源官网重构
未来的开发不再仅仅是 Coding,而是对 AI 能力的深度编排。
1255 45
|
4月前
|
存储 人工智能 关系型数据库
OpenClaw怎么可能没痛点?用RDS插件来释放OpenClaw全部潜力
OpenClaw插件是深度介入Agent生命周期的扩展机制,提供24个钩子,支持自动注入知识、持久化记忆等被动式干预。相比Skill/Tool,插件可主动在关键节点(如对话开始/结束)执行逻辑,适用于RAG增强、云化记忆等高级场景。
1268 56
OpenClaw怎么可能没痛点?用RDS插件来释放OpenClaw全部潜力
|
4月前
|
人工智能 Rust 安全
OpenClaw(Clawdbot)阿里云+本地部署步骤流程,附 OpenFang 迁移保姆级指南
2026年AI智能体领域迎来重要突破——OpenFang开源发布,这款基于Rust构建的Agent操作系统,以7个内置“数字员工”(Hands)、16层安全机制、仅50MB的内存占用,成为OpenClaw等同类工具的强力竞品。OpenClaw作为经典的个人AI助手系统,凭借“单Gateway架构+多渠道兼容+本地优先”的特性,仍占据重要市场地位。本文将详细拆解2026年OpenClaw的阿里云与本地部署全流程,同时对比OpenClaw与OpenFang的核心差异,提供OpenClaw用户迁移至OpenFang的实操方案,全程无营销词汇,所有代码命令可直接复制执行。
2605 5
|
5月前
|
机器学习/深度学习 SQL 人工智能
别再群发拜年消息了!三步微调AI,让它学会你的“独家语气”
每逢春节,通用AI祝福总显生硬空洞。本文探讨如何通过微调(LoRA),将“人情世故”转化为结构化数据(称呼/关系/细节/风格等),让AI真正学会你的语气与记忆,生成有温度、带梗、专属的个性化祝福——技术不是替代表达,而是帮你把来不及说的情意,说得恰到好处。(239字)
558 16
别再群发拜年消息了!三步微调AI,让它学会你的“独家语气”
|
3月前
|
数据采集 人工智能 搜索推荐
别再把AI当搜索引擎用了!3个提示词技巧,让你的工作效率翻倍
别再把AI当搜索引擎用了!3个提示词技巧,让你的工作效率翻倍
417 148
|
3月前
|
数据采集 数据可视化 数据挖掘
数据仓库是什么?数据仓库和BI有什么区别?
BI与数据仓库常被混淆,实则分工明确:数据仓库是底层数据底座,负责多源整合、清洗建模、统一口径;BI是上层应用,专注分析、可视化与决策支持。二者一前一后、相辅相成,缺一不可。

热门文章

最新文章