”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > PHP 属性:如何使用 PHP 属性并创建自定义属性类 – 快速提示

PHP 属性:如何使用 PHP 属性并创建自定义属性类 – 快速提示

发布于2024-11-03
浏览:760

PHP 属性是在 PHP 8.0 中引入的。该版本标志着该语言的一个重要里程碑,带来了一些新功能和改进,包括引入用于向代码声明添加元数据的属性。

我第一次必须处理属性是由于 Inspector 的 PHP 库中的一个问题。检查 GitHub。在深入研究解决方案之前,让我们先概述一下属性是什么以及如何在 PHP 代码中使用它们。

属性是一项强大的功能,允许您将元数据添加到类、方法或属性等声明中。这些元数据可以通过编程方式检索,为更干净、更有组织、更高效的代码开辟了新的可能性。

请记住,属性在运行时不起作用。它们将在反射 API 中可用,使您的应用程序能够根据附加到类、方法或属性的属性了解您想要运行的内容。

内置属性

PHP 附带了几个用于不同目的的内置属性。以下是一些值得注意的:

@已弃用

将函数或方法标记为已弃用,表明应避免使用它,因为它可能会在未来版本中被删除。

#[Deprecated("Use newFunction() instead")]
function oldFunction() 
{
    // Function implementation
}

@覆盖

确保子类中的方法旨在覆盖父类中的方法。

class Child extends Parent {
    #[Override]
    public function defaultMethod() 
    {
        // Method implementation
    }
}

如果defaultMethod()最终将在父类中更改其名称,则这不再是覆盖。在这种情况下,PHP 将发出警告,因为我们明确声明我们希望进行覆盖并提醒我们有关未对齐的情况。

不管怎样,一个好的IDE应该能让我们不犯这样的错误。

@SuppressWarnings

抑制特定代码段的特定警告。

#[SuppressWarnings("SomeWarning")]
function someFunction() 
{
    // Function implementation
}

创建自定义属性类

现在,让我们创建一个自定义属性类。当您想要将特定行为封装在属性中时,这非常有用。

#[Attribute]
class CustomAttribute 
{
    public string $message;

    public function __construct(string $message) 
    {
        $this->message = $message;
    }
}

然后您可以在各种元素上使用此自定义属性:

class MyClass 
{
    #[CustomAttribute("This is a custom attribute")]
    public $myProperty;

    #[CustomAttribute("Another custom attribute")]
    public function myMethod() 
    {
        // Method implementation
    }
}

使用示例

让我们探讨一个实际的例子。假设您正在构建一个 Web 应用程序,并且您想要创建一个自定义属性来定义字符串的长度:

#[Attribute(Attribute::TARGET_PROPERTY)]
class MaxLength 
{
    public int $maxLength;

    public function __construct(int $maxLength) 
    {
        $this->maxLength = $maxLength;
    }
}

在上面的示例中,我们限制了仅将属性应用于类属性的能力。现在我们可以在 User 类中使用它:

class User 
{
    #[MaxLength(20, message: "Username must be 20 characters or less")]
    public string $username;

    // Other properties and methods
}

正如之前提到的,将属性添加到属性在执行过程中没有影响。但我们现在可以使用反射检索这些信息,最终采取一些行动。

PHP 框架的采用

Symfony 和 Laravel 等最常用的 PHP 框架已经采用属性来基本上取代“注释”。在 Symfony 5.2 或更高版本中,您可以声明一个控制器并使用属性将其连接到路由:

public class Arrayable implements \ArrayAccess
{
    …

    public function offsetExists($offset)
    {
        return isset($this->data[$offset]);
    }

    …
}

自 PHP 8 起,ArrayAccess 接口的定义更改为:

PHP Attributes: how to use PHP Attributes and create custom attribute classes – Fast Tips

通过使用属性,他们强制声明偏移函数中参数的数据类型。使用 LanguageLevelTypeAware 属性,如果实现不提供参数的数据类型,则会引发“弃用警告”。

但是在函数参数中声明数据类型会破坏与不支持参数数据类型声明的旧版本 PHP 的兼容性。

由于这只是对未来更改的警告,我们使用另一个内置 PHP 属性来解决该问题以抑制警告:

public class Arrayable implements \ArrayAccess
{
    …

    #[\ReturnTypeWillChange]
    public function offsetExists($offset)
    {
        return isset($this->data[$offset]);
    }

    …
}

ReturnTypeWillChange 属性只是告诉 PHP 我们了解该语言的未来变化,并且我们已经计划了必要的更新。

对于这一变化,它们肯定会在 PHP 9 中实现。

请记住明智地使用属性,保持代码库干净且记录齐全。这在 SaaS 产品开发中尤其重要,因为可扩展性、可维护性和效率至关重要。

督察新人?免费监控您的应用程序

Inspector是专门为软件开发人员设计的代码执行监控工具。您无需在服务器级别安装任何内容,只需安装 composer 软件包 即可开始使用。

与其他复杂的一体化平台不同,Inspector 非常简单,并且对 PHP 友好。您可以尝试我们的 Laravel 或 Symfony 包。

如果您正在寻找有效的自动化、深入的见解以及将警报和通知转发到您的消息传递环境的能力,请免费尝试 Inspector。注册您的帐户。

或者在网站上了解更多信息:https://inspector.dev

PHP Attributes: how to use PHP Attributes and create custom attribute classes – Fast Tips

版本声明 本文转载于:https://dev.to/inspector/php-attributes-how-to-use-php-attributes-and-create-custom-attribute-classes-fast-tips-7nf?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用 Twitter Bootstrap 对齐表格中的文本?
    如何使用 Twitter Bootstrap 对齐表格中的文本?
    Twitter Bootstrap 中的表格文本对齐在 Twitter 的 Bootstrap 框架中,您可以使用指定的文本对齐类来对齐表格内的文本。 Bootstrap 3text-left:左对齐文本text-center:居中对齐文本text-right:右对齐文本Bootstrap 4tex...
    编程 发布于2024-11-15
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-15
  • 如何使 CSS 中的空表格单元格的边框可见?
    如何使 CSS 中的空表格单元格的边框可见?
    我可以在 CSS 中使空单元格的边框可见吗?在 Internet Explorer 7 中,默认情况下可能不会显示空单元格的边框。不过,有几种方法可以解决此问题。使用不间断空格如果可行,请插入不间断空格 ( )进入空单元格可以强制浏览器渲染带有边框的单元格。纯 CSS 解决方案对于纯 CS...
    编程 发布于2024-11-15
  • 如何将 Python 列表转换为 CSV 文件?
    如何将 Python 列表转换为 CSV 文件?
    将 Python 列表列表导出到 CSV 文件您的目标是将 Python 列表列表转换为 CSV 文件,确保每个子列表中都会保留不同类型(浮点型、整数型、字符串型)的数据。所需的 CSV 格式涉及使用逗号分隔每个子列表中的元素并垂直对齐子列表。要实现此目的,您可以利用 Python 的内置 csv ...
    编程 发布于2024-11-15
  • 测试限制:了解软件测试的边界
    测试限制:了解软件测试的边界
    软件测试是确保软件质量、稳定性和功能的开发过程的重要组成部分。然而,尽管测试很重要,但它也有其局限性。虽然它可以揭示缺陷,但它不能保证应用程序完全没有错误。了解这些限制有助于企业和开发人员设定切合实际的期望并优化他们的测试流程。在本文中,我们将探讨软件测试的主要局限性及其带来的挑战。 无法测试每个...
    编程 发布于2024-11-15
  • 如何有效地将文件加载到`std::vector`中?
    如何有效地将文件加载到`std::vector`中?
    高效地将文件加载到 std::vector高效地将文件加载到 std::vector,必须避免不必要的复制和内存重新分配。虽然利用 Reserve 和 read() 的原始方法可能看起来很直接,但单独的 Reserve() 并不会改变向量的容量。使用迭代器的规范方法:规范方法使用输入流迭代器来方便地...
    编程 发布于2024-11-15
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-15
  • 如何在 Go 中将数组元素直接解压为变量?
    如何在 Go 中将数组元素直接解压为变量?
    在 Go 中解包数组元素Go 缺乏将数组元素直接解包到 Python 中的变量的便捷语法。虽然提问者使用中间变量的初始方法有效,但它可能会导致代码混乱,尤其是在复杂的场景中。多个返回值为了解决这个问题,建议使用解决方案是创建一个返回多个值的函数。例如,要拆分字符串并将结果解压为两个变量,可以使用如下...
    编程 发布于2024-11-15
  • “n:m”和“1:n”关系如何塑造数据库设计?
    “n:m”和“1:n”关系如何塑造数据库设计?
    理解关系数据库设计:“n:m”和“1:n”的意义在数据库设计中,符号“ n:m”和“1:n”在表示表或实体之间的关系方面起着至关重要的作用。这些符号表示它们关联的基数。"n:m" 关系:多对多“n:m”关系表示多对多两个数据实体之间的对多关联。这意味着对于一个表中的每个实体,它可...
    编程 发布于2024-11-15
  • 如何在 Java 中查找重定向的 URL?
    如何在 Java 中查找重定向的 URL?
    在 Java 中查找重定向 URL在 Java 中访问网页时,处理 URL 重定向到备用位置的情况至关重要。要确定重定向的 URL,您可以使用 URL 和 URLConnection 类。使用 URLConnection.getUrl()使用 URLConnection 建立连接后,您可以检索连接通...
    编程 发布于2024-11-15
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-15
  • 在 C++ 中将字符串转换为整数时如何处理转换错误?
    在 C++ 中将字符串转换为整数时如何处理转换错误?
    使用 C 中的错误处理将字符串转换为 int 将字符串转换为整数是编程中的常见任务。但是,在某些情况下,字符串值可能无法成功转换为整数。在这种情况下,优雅地处理转换失败至关重要。boost::lexical_cast将字符串转换为 int 时出现错误的最直接方法之一处理方法是使用 boost::le...
    编程 发布于2024-11-15
  • 如何在 JavaScript 中访问 PHP 变量?
    如何在 JavaScript 中访问 PHP 变量?
    在 JavaScript 中访问 PHP 变量直接在 JavaScript 中访问 PHP 变量是一个挑战。但是,有一些方法可以实现此目的:使用嵌入式 PHP 语句:在 JavaScript 块中嵌入 PHP 代码允许您将 PHP 变量分配给 JavaScript 变量:<script typ...
    编程 发布于2024-11-15
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-15
  • 多线程概念 部分死锁
    多线程概念 部分死锁
    欢迎来到我们的多线程系列的第 3 部分! 在第 1 部分中,我们探讨了原子性 和 不变性。 在第 2 部分中,我们讨论了饥饿。 在这一部分中,我们将深入研究多线程中死锁的机制。原因是什么,如何识别以及可以使用的预防策略,以避免将代码变成僵局。应用程序逐渐停止,通常没有任何明显的错误,让开发人员...
    编程 发布于2024-11-15

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3