Working with PHP Attributes: Do’s & Don’ts

working with php attributes: do’s & don’ts

php 中的属性允许您直接使用元数据注释代码元素,从而简化了代码配置,从而可能减少 laravel 等框架中的样板文件。然而,与任何功能一样,属性可能会被过度使用或误用,从而导致控制器混乱和代码难以维护。

在这篇文章中,我们将探索以增强代码清晰度的方式使用属性的最佳实践。我还将提供一个“该做和不该做”的表格,其中包含每次比较的示例,突出显示属性工作良好的场景以及可能不工作的场景。

1. 理解php中的属性

这是定义和使用属性来提供一些上下文的快速示例:

#[attribute]class mycustomattribute {    public function __construct(public string $description) {}}#[mycustomattribute("this is a test class")]class myclass {    #[mycustomattribute("this is a test method")]    public function mymethod() {}}

2. 注意事项:快速概述

下表总结了最佳实践和常见陷阱:

do’s don’ts

use attributes for standard, repetitive configurations (e.g., http methods, caching).don’t overload attributes with complex configurations or conditional logic.leverage attributes for metadata rather than core application logic.avoid embedding business logic or intricate rules within attributes.apply attributes for simple, reusable annotations (e.g., #[throttle], #[cache]).don’t try to replace laravel’s route files entirely with attribute-based routing.cache attribute-based reflections when possible to improve performance.don’t rely solely on attributes for configurations that need flexibility or change often.document your attributes, so team members understand their purpose and usage.avoid using attributes for configurations where traditional methods work better (e.g., middleware settings).

3. 实例详细比较

让我们通过具体示例深入了解每个比较。

立即学习“PHP免费学习笔记(深入)”;

1. 使用属性进行标准、重复的配置(执行)

属性非常适合不需要复杂逻辑的标准配置。以下是三个很好的例子:

定义路由:使用属性通过 http 方法和路径定义简单的路由。

  #[attribute]  class route {      public function __construct(public string $method, public string $path) {}  }  class productcontroller {      #[route('get', '/products')]      public function index() {}  }

缓存控制:使用属性指定方法的缓存持续时间。

  #[attribute]  class cache {      public function __construct(public int $duration) {}  }  class productcontroller {      #[cache(3600)]      public function show($id) {}  }

速率限制:throttle 属性可用于限制每个用户的请求数量。

  #[attribute]  class throttle {      public function __construct(public int $maxattempts) {}  }  class usercontroller {      #[throttle(5)]      public function store() {}  }

不要使用复杂的配置来重载属性(不要)

避免对需要多个参数或条件的配置使用属性。以下是不应该做的事情:

使用多个配置重载:避免向属性添加多个参数。

  #[attribute]  class route {      public function __construct(          public string $method,          public string $path,          public ?string $middleware = null,          public ?string $prefix = null      ) {}  }  #[route('post', '/users', middleware: 'auth', prefix: '/admin')]

属性中的条件逻辑:避免属性内的条件设置。

  #[attribute]  class condition {      public function __construct(public string $condition) {}  }  class controller {      #[condition("isadmin() ? 'adminroute' : 'userroute'")]      public function index() {}  }

单个属性中的链接配置:避免在一个属性中链接多个配置行为。

  #[attribute]  class combined {      public function __construct(          public int $cacheduration,          public int $ratelimit      ) {}  }  #[combined(cacheduration: 300, ratelimit: 5)]

2. 利用元数据的属性(执行)

使用属性作为标记或元数据,而不是在其中嵌入应用程序逻辑。方法如下:

验证注释:使用属性将字段标记为必填。

  #[attribute]  class required {}  class user {      #[required]      public string $name;  }

指定 http 方法作为元数据:使用属性来标记 http 方法类型。

  #[attribute]  class get {}  class blogcontroller {      #[get]      public function list() {}  }

指示访问级别:使用属性来指示访问级别要求。

  #[attribute]  class requiresadmin {}  class settingscontroller {      #[requiresadmin]      public function update() {}  }

不要在属性中嵌入业务逻辑(不要)

避免使用属性直接确定应用程序行为。以下是不应该做的事情:

避免在属性中使用直接条件:不要在属性中放置条件检查。

  #[attribute]  class accesscontrol {      public function __construct(public string $role) {}  }  #[accesscontrol(role: isadmin() ? 'admin' : 'user')]

避免在属性中调用方法:不要在属性中放置函数调用或业务逻辑。

  #[attribute]  class conditionalcache {      public function __construct(public int $duration) {}  }  #[conditionalcache(duration: userhaspremium() ? 3600 : 300)]

避免在属性中使用计算值:属性应该是静态元数据,而不是计算值。

  #[attribute]  class cache {      public function __construct(public int $duration) {}  }  #[cache(duration: (int)env('cache_duration'))]

3. 将属性应用于简单、可重用的注释(执行)

属性非常适合可重用的轻量级注释。以下是一些可重用的注释示例:

simple throttle:用于限制请求速率的简单节流属性。

  #[attribute]  class throttle {      public function __construct(public int $limit) {}  }  #[throttle(5)]

缓存控制:使用单个持续时间参数添加缓存控制属性。

  #[attribute]  class cache {      public function __construct(public int $duration) {}  }  #[cache(120)]

弃用警告:将方法标记为弃用以提醒开发人员。

  #[attribute]  class deprecated {      public function __construct(public string $message) {}  }  #[deprecated("this method will be removed in v2.0")]

不要过度使用其他格式更容易的配置属性(不要)

某些配置在属性之外可以得到更好的管理。以下是不应该做的事情:

中间件配置:避免直接在属性中配置中间件。

  #[attribute]  class middleware {      public function __construct(public string $name) {}  }  #[middleware('auth')]

授权规则:复杂的授权配置最好放在策略文件中。

  #[attribute]  class permission {      public function __construct(public string $requiredpermission) {}  }  #[permission("edit_post")]

复杂的验证规则:将验证逻辑排除在属性之外。

  #[Attribute]  class Validate {      public function __construct(public array $rules) {}  }  #[Validate(['name' => 'required|min:3'])]

结论

属性提供了一种优雅的方式来处理重复配置,特别是在 laravel 这样的 php 框架中。

但是,它们作为简单的元数据效果最好,并且必须避免使用复杂的配置或逻辑使它们过载。

通过遵循最佳实践并将属性用作轻量级、可重用的注释,您可以充分利用它们的潜力,而不会给代码库增加不必要的复杂性。

赞助

通过在 github 赞助商上赞助我来支持我的开源工作!您的赞助帮助我不断创建有用的 laravel 软件包、工具和教育内容,让开发者社区受益。感谢您帮助让开源变得更好!

照片由 milad fakurian 在 unsplash 上拍摄

以上就是Working with PHP Attributes: Do’s & Don’ts的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1249651.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 21:33:37
下一篇 2025年12月8日 06:49:03

相关推荐

  • 如何在 Laravel 中处理大型数据集而不耗尽内存

    如何在 laravel 中处理大型数据集而不耗尽内存 在 laravel 中处理大量数据时,经常会遇到应用程序内存不足等问题。当尝试一次将数千(甚至数百万)条记录加载到内存中时,可能会发生这种情况。然而,laravel 提供了一些有用的方法来帮助您以较小的块处理数据,从而节省内存并使应用程序运行得更…

    2025年12月9日
    000
  • Comprehensive Methods to Display Arrays in PHP and Laravel

    在 php 和 laravel 中显示数组 这里有几种在 php 和 laravel 中显示数组的方法,以及它们的示例和用法。根据您的要求,每种方法都有不同的用途。 主题:print_r、var_dump、var_export、json_encode、foreach、dd、dump、blade、js…

    2025年12月9日
    000
  • 如何在 Laravel 中创建多语言网站

    本文将为您提供如何在 laravel 中创建多语言网站的示例。您可以理解 laravel 多语言网站示例的概念。在这里你将学习如何在 laravel 中添加多种语言。这是带有语言下拉菜单的 laravel 多语言的简单示例。您可以学习如何在 laravel 中使用全局作用域 让我们按照以下 lara…

    2025年12月9日
    000
  • 如何提高 php 水平

    提高 php 水平需要持续学习。对于成长中的 php 开发人员来说,这是一个关键阶段。以下是提高 php 技能的基本步骤: 从基础开始 专家总是建议从核心概念开始,例如变量、数据类型和控制结构。这是提高 PHP 编码技能最重要的学习路径。 创建您的工作空间 首先,创建您的开发环境作为您的创作空间。通…

    2025年12月9日
    000
  • 初学者提高编程逻辑的 5 个技巧

    编程方法的5个步骤是什么?如何才能擅长编程逻辑?编程逻辑的基础是什么?初学者应该如何开始编程? 想要找到这些问题的答案吗?请继续阅读。 计算机系统中的一组规则,也称为编程逻辑,指定了某些组件的放置顺序,以使计算机硬件能够执行特定任务。换句话说,编程逻辑是以系统的方式应用规则来产生可行的结果。 编程逻…

    2025年12月9日
    100
  • PHPStan:通过静态分析提高 PHP 代码质量

    在动态类型盛行的 php 生态系统中,管理代码质量并确保无错误开发可能具有挑战性。 phpstan 是一款专为 php 定制的静态分析工具,旨在帮助开发人员在运行代码之前捕获错误和潜在问题。通过静态分析,phpstan 允许开发人员通过在开发早期捕获错误来编写更可靠、可维护和健壮的代码。在这篇文章中…

    2025年12月9日
    000
  • NexaPHP 简介:轻量级 MVC PHP 框架

    构建 php 应用程序通常涉及大量样板代码和组织以保持干净的结构。许多开发人员使用 laravel 或 symfony 等框架来处理此问题,但如果您只需要一个轻量级、简单的 mvc(模型-视图-控制器)框架怎么办? nexaphp 可能正是您正在寻找的。这个极简主义框架是为那些想要精益结构而没有大型…

    2025年12月9日
    000
  • 如何在 Laravel 中包含 JavaScript 适用于所有场景的分步指南

    如何在 laravel 11 中包含 javascript:适用于所有场景的分步指南 在 laravel 11 中,向项目添加 javascript 变得轻而易举,这要归功于默认的资源捆绑器 vite。以下是如何为各种场景设置 javascript,从全局包含到特定视图中的条件加载。 1. 在所有文…

    2025年12月9日
    000
  • Laravel 观察者:应用程序生命周期中的沉默忍者

    简介 想象一下,每当您在网站上提交表单时,一个隐形助手就会进来并再次检查所有内容。添加更多详细信息,甚至无需您费力即可发送一封欢迎信。 laravel 观察者就像默默工作的幕后助手。而且它的功能强大,可以在您需要时处理所有任务。在这篇文章中,我们将深入探讨观察者在 laravel 中的工作方式,以及…

    2025年12月9日
    000
  • Laravel 应用程序安全

    构建安全的 Laravel 应用程序有时可能感觉像是事后诸葛亮,但 Stephen Rees-Carter 在 Laracon AU 2024 上放弃了一些严肃的知识,这让我重新思考了一些事情。 Stephen 是一位有道德的黑客,他目睹了这一切——我的意思是他侵入了很多 Laravel 应用程序,…

    2025年12月9日
    000
  • 在 Laravel Livewire 中使用多个图像选择

    在本文中,我将向您展示一个简单的想法,当您想使用 livewire 和 laravel 来选择更多图像时,可以修复先前选择的图像丢失的问题。 我知道有多种方法可以实现这一点,但我发现在一些 livewire 生命周期钩子的帮助下这个方法非常简单,这些是 更新和更新的挂钩。 此屏幕截图显示了您的 li…

    2025年12月9日
    000
  • Laravel 显示存储文件夹中的图像示例

    在这篇文章中,我将向您展示如何在 laravel 11 应用程序中显示存储应用公共文件夹中的图像。 laravel 提供了一种安全的方式将图像和文件存储在 storage 文件夹中,防止用户通过 url 直接访问文件。那么,我们如何才能显示存储文件夹中的这些图像呢?下面,我将概述两种可用于安全地显示…

    2025年12月9日
    000
  • Laravel Google Recaptcha 验证教程

    在这篇文章中,我将向您展示 laravel 11 google recaptcha v3 验证教程。 google recaptcha v3 是一个类似验证码的系统,可提供针对黑客和脚本或 curl 请求的安全保护。它确保计算机用户是人类。它是最好和最常用的验证码系统,用户只需单击复选框,并在某些情…

    2025年12月9日
    000
  • 使用 PHP 集成 Lloyds 支付卡:Cardnet 托管支付页面(连接解决方​​案)

    介绍 集成安全可靠的支付网关对于电子商务业务至关重要。劳埃德银行的 cardnet® 托管支付页面解决方案 connect 提供了一种安全的交易处理方式。客户将被重定向到劳埃德托管的页面以完成交易,然后返回您的网站。以下是您如何设置它、将其与 php 集成并为您的用户提供无缝体验的方法。 lloyd…

    2025年12月9日
    000
  • Laravel Nightwatch:Laravel 应用程序监控的未来在 Laracon AU 上揭晓

    随着 Laracon AU 发布 Laravel Nightwatch,Laravel 的生态系统不断扩展 – 一个专门为 Laravel 应用程序设计的复杂监控平台。 Nightwatch 将于 2025 年第一季度抢先体验,承诺彻底改变开发者监控和维护 Laravel 应用程序的方式…

    2025年12月9日
    000
  • PHP 中的机器学习:使用 Rubix ML 构建新闻分类器

    介绍 机器学习无处不在——推荐电影、标记图像,现在甚至对新闻文章进行分类。想象一下如果您可以在 php 中做到这一点!借助 rubix ml,您可以以简单易懂的方式将机器学习的强大功能引入 php。本指南将引导您构建一个简单的新闻分类器,将文章分类为“体育”或“技术”等类别。最后,您将拥有一个工作分…

    2025年12月9日
    000
  • 保护您的 PHP 应用程序免受常见漏洞影响的基本安全实践

    保护您的 php 应用程序涉及保护其免受常见漏洞的影响,例如 sql 注入、跨站点脚本 (xss)、跨站点请求伪造 (csrf)、会话劫持和文件包含攻击。这是一个带有逐部分描述的实践示例,可帮助您了解如何保护 php 应用程序。 1. 防止sql注入 当攻击者可以将恶意 sql 语句注入您的查询时,…

    2025年12月9日
    000
  • PHP 初学者:选择开源框架还是自己构建框架?

    PHP 框架选择与自身框架构建 对于希望编写自己的 PHP 框架的初学者来说,学习开源框架是必不可少的。本文将介绍一些流行的 PHP 框架,并提供编写框架的建议。 推荐开源框架 ThinkPHP: 为电商平台量身打造,注重简单、高效。Zend Framework: 企业级框架,功能丰富,适用于大型项…

    2025年12月9日
    000
  • 如何创建 ajax 如何在 laravel 11 中创建依赖 ajax 的下拉菜单

    在本教程中,我将教您如何在 laravel 11 应用程序中创建依赖于 ajax 的下拉菜单。我们将在 laravel 11 中为国家、州和城市选择创建动态依赖下拉菜单。 什么是依赖下拉菜单?从属下拉菜单是一种菜单类型,其中一个下拉菜单中的可用选项取决于另一个下拉菜单中所做的选择。例如,如果您在第一…

    2025年12月9日
    000
  • Laravel 本地化教程

    laravel 11 本地化教程 在本教程中,我将向您展示 laravel 11 本地化教程,如何在 laravel 11 应用程序中使用本地化来实现多语言支持。 什么是 laravel 本地化? laravel 本地化是一项允许您创建多语言网站的功能。它可以帮助您将应用程序的内容翻译成不同的语言。…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信