maslosoft/addendum

强大且易于使用的PHP注解

7.0.5 2023-11-22 14:12 UTC

README

Addendum Logo Maslosoft Addendum

强大且易于使用的PHP注解

Latest Stable Version License Scrutinizer Code Quality Code Coverage

快速安装

composer require maslosoft/addendum

文档

完整的 Addendum 文档

PHP 注解

本项目旨在提供针对 PHP 语言的智能注解支持,目标在于性能和易用性。

注解实际上是一种嵌入 PHP 代码中的声明性语言。它不允许流程控制结构、循环、条件。它允许我们描述代码所需的或我们期望的部分代码。

使用注解的位置

虽然(PHP)编程语言本身非常灵活,允许我们描述复杂的行为了,但在某些方面我们只想描述(或配置)这样的行为。我们还想保持我们的 主要 代码保持不变,同时添加一些额外的行为,这些可能包括

  • 访问控制
  • 显示数据的方式
  • 是否存储数据
  • 在哪里存储数据
  • 数据是否应可搜索

等等,随着不断增长的行为和方面列表。虽然这可以通过在我们的类中实现越来越多的接口来完成,但很快这些接口就会变成数百个方法。

另一种方法可能是某种类型的额外元数据配置,无论是 XML、JSON 还是 YAML 文件。这需要我们保持这些文件同步,并且将声明与代码分开。但是,我们可能需要为许多库提供额外的行为/方面,导致代码被分成两个或更多文件。

将行为嵌入代码中

因此,想法是将类的这些额外方面嵌入代码中。通过注解——特殊注释标签,放置在类/方法/属性声明之上。

这些注解可以由程序的不同部分独立解释。这些是可扩展的,因此添加更多注解不会影响现有代码。

不同的应用程序部分可能只解释部分注解,而忽略未知的注解。

在下面的示例中,一个部分会对 @Label@Description 声明做出反应,另一个部分会在遇到 @I18N 注解时执行一些额外的操作。

示例

class Page implements AnnotatedInterface
{
	/**
	 * Page URL
	 * @Label('Page URL')
	 * @Description('Relative URL, it should be simple lowercase string with words separated by hyphen')
	 * @SearchBoost(3.5)
	 * @I18N
	 * @SafeValidator
	 * @UrlValidator
	 * @Decorator(Action, 'update')
	 * @see Action
	 * @var string
	 */
	public $url = '';
}

所有额外的元数据都包含在类属性声明的地方。这就是全部。注解本身在每次请求时 被评估。它们用于生成元数据,这些元数据稍后可以通过使用元容器获得。任何实现了 AnnotatedInterface 的对象,都可以通过传递对象或类名来获取元数据。

获取元数据的示例

echo Meta::create(Page::class)->url->label;
// Will echo "Page URL"

此元数据已缓存,因此无需解析注解的开销。