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

目录
相关文章
|
2月前
|
人工智能 关系型数据库 Serverless
2 天,用函数计算 AgentRun 爆改一副赛博朋克眼镜
2 天将吃灰的 Meta 眼镜改造成“交警Copilot”:通过阿里云函数计算 AgentRun 实现端-管-云协同,利用 Prompt 驱动交通规则判断,结合 OCR 与数据库查询,打造可动态扩展的智能执法原型,展现 Agent 架构在真实场景中的灵活与高效。
359 44
|
2月前
|
人工智能 安全 调度
AI工程vs传统工程 —「道法术」中的变与不变
本文从“道、法、术”三个层面对比AI工程与传统软件工程的异同,指出AI工程并非推倒重来,而是在传统工程坚实基础上,为应对大模型带来的不确定性(如概率性输出、幻觉、高延迟等)所进行的架构升级:在“道”上,从追求绝对正确转向管理概率预期;在“法”上,延续分层解耦、高可用等原则,但建模重心转向上下文工程与不确定性边界控制;在“术”上,融合传统工程基本功与AI新工具(如Context Engineering、轨迹可视化、多维评估体系),最终以确定性架构驾驭不确定性智能,实现可靠价值交付。
439 41
AI工程vs传统工程 —「道法术」中的变与不变
|
17天前
|
缓存 NoSQL PHP
秒杀活动时系统在干什么 PHP 高并发场景优化指南
本文详解PHP应对秒杀高并发的全链路优化方案:通过负载均衡+自动扩容分担流量,Redis缓存热点数据减压DB,分库分表、读写分离与连接池提升数据库性能,JWT+Redis实现无状态会话,Kafka事件驱动保障库存一致性。240字
90 16
|
14天前
|
机器学习/深度学习 SQL 人工智能
别再群发拜年消息了!三步微调AI,让它学会你的“独家语气”
每逢春节,通用AI祝福总显生硬空洞。本文探讨如何通过微调(LoRA),将“人情世故”转化为结构化数据(称呼/关系/细节/风格等),让AI真正学会你的语气与记忆,生成有温度、带梗、专属的个性化祝福——技术不是替代表达,而是帮你把来不及说的情意,说得恰到好处。(239字)
241 16
别再群发拜年消息了!三步微调AI,让它学会你的“独家语气”
|
18天前
|
人工智能 自然语言处理 安全
2026年阿里云无影云电脑OpenClaw(Clawdbot)一键部署全攻略,新手小白抄作业
2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自然语言指令+主动执行任务”的核心能力,成为AI办公自动化的标杆工具,从文件管理、网页操作到多渠道联动,它能像“专属数字员工”一样,帮你搞定所有琐碎事务,彻底解放双手。但对零基础新手小白来说,传统部署方式中的环境配置、依赖安装、参数调试等操作,曾是难以跨越的门槛——直到阿里云无影云电脑推出OpenClaw(Clawdbot)专属一键部署方案,彻底打破了这一困境。
377 15
|
2月前
|
人工智能 Java Nacos
构建开放智能体生态:AgentScope 如何用 A2A 协议与 Nacos 打通协作壁垒?
AgentScope 全面支持 A2A 协议和 Nacos 智能体注册中心,实现跨语言跨框架智能体互通。
607 55
|
2月前
|
弹性计算 运维 应用服务中间件
ECS和轻量应用服务器选哪个?阿里云轻量和ECS有什么区别?2026新手实测
阿里云ECS与轻量应用服务器核心区别:ECS功能全面、弹性强,适合企业级高负载场景;轻量服务器开箱即用、操作简单、性价比高,专为个人开发者、学生及低流量网站(博客、测试环境等)设计。2026实测对比涵盖场景、配置、带宽、计费、运维等维度,助你一键选对!
|
19天前
|
数据采集 运维 数据挖掘
《分布式跨域业务事务可用性与性能度量手册》
本文聚焦分布式系统中跨数十服务的业务事务,提出一套脱离单点指标局限的全域度量体系。文章从语义锚定与边界切片完成事务定义,构建以稳态存续度、断层自愈率为核心的可用性评估模型,提出流转时延熵、节点协同滞涩度衡量整体性能,通过事务态画像与趋势推演因子实现数据落地,并强调度量体系需动态域校准与弹性适配。全文结合实践思考,阐述跨服务业务事务可用性与性能的深度度量方法,为分布式系统优化提供可落地的技术思路。
192 133
|
26天前
|
人工智能 机器人 API
Laravel AI SDK 在 Laracon India 2026 首次亮相
Laravel AI SDK 于 Laracon India 2026 首发!由 Taylor Otwell 打造,提供统一优雅的 API,支持聊天、图像/音频生成、转录、语义搜索(embeddings)等,兼容 OpenAI、Gemini、ElevenLabs 等多服务商,开箱即用,深度集成 Laravel 生态。(239字)
150 7
|
12天前
|
存储 供应链 数据可视化
大模型应用:面向结构化表格的 RAG 实践:技术架构与特性解析.26
本文提出面向结构化表格的RAG新模式,突破传统RAG将表格转为纯文本导致语义丢失、多表融合低效、版本兼容性差等瓶颈。通过结构化解析、元数据增强、向量索引优化与精细化检索,实现行列语义保留、跨表关联查询及本地轻量化部署,显著提升财务、政务等场景下Excel/CSV数据的检索精度与问答质量。
95 11

热门文章

最新文章