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("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 }
正如之前提到的,将属性添加到属性在执行过程中没有影响。但我们现在可以使用反射检索这些信息,最终采取一些行动。
Symfony 和 Laravel 等最常用的 PHP 框架已经采用属性来基本上取代“注释”。在 Symfony 5.2 或更高版本中,您可以声明一个控制器并使用属性将其连接到路由:
public class Arrayable implements \ArrayAccess { … public function offsetExists($offset) { return isset($this->data[$offset]); } … }
自 PHP 8 起,ArrayAccess 接口的定义更改为:
通过使用属性,他们强制声明偏移函数中参数的数据类型。使用 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
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3