maslosoft / addendum
强大且易于使用的PHP注解
Requires
- php: >=7.4
- maslosoft/cache: *
- maslosoft/cli-shared: ^1 | ^2
- maslosoft/embedi: ^2
- maslosoft/gazebo: ^2
- psr/log: ^1|^2|^3
Requires (Dev)
- codeception/codeception: ^5
- codeception/module-asserts: ^3
- codeception/specify: ^2
- maslosoft/signals: *@dev
- maslosoft/zamm: ^1 || ^2
- monolog/monolog: ^2
- roave/security-advisories: dev-latest
Suggests
- maslosoft/signals: Collect annotation namespaces with signals
- monolog/monolog: Sends your logs to files, sockets, inboxes, databases and various web services
- dev-master
- 7.0.5
- 7.0.4
- 7.0.3
- 7.0.2
- 7.0.1
- 7.0.0
- 6.0.5
- 6.0.4
- 6.0.3
- 6.0.2
- 6.0.1
- 6.0.0
- 5.0.21
- 5.0.20
- 5.0.19
- 5.0.18
- 5.0.17
- 5.0.16
- 5.0.15
- 5.0.14
- 5.0.12
- 5.0.11
- 5.0.10
- 5.0.9
- 5.0.8
- 5.0.7
- 5.0.6
- 5.0.5
- 5.0.4
- 5.0.3
- 5.0.2
- 5.0.1
- 5.0.0
- 4.0.21
- 4.0.20
- 4.0.19
- 4.0.18
- 4.0.17
- 4.0.16
- 4.0.15
- 4.0.14
- 4.0.13
- 4.0.12
- 4.0.11
- 4.0.10
- 4.0.9
- 4.0.8
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.1.8
- 3.1.7
- 3.1.6
- 3.1.5
- 3.1.4
- 3.1.3
- 3.1.2
- 3.1.1
- 3.1.0
- 3.0.13
- 3.0.12
- 3.0.11
- 3.0.10
- 3.0.9
- 3.0.8
- 3.0.7
- 3.0.6
- 3.0.5
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0-alpha.1
- 2.1.0
- 2.0.2
- 2.0.1
- 2.0.0
- 1.0.1
- 1.0.0
- dev-dependabot/composer/guzzlehttp/psr7-2.5.0
This package is auto-updated.
Last update: 2024-09-22 15:56:34 UTC
README
Maslosoft Addendum
快速安装
composer require maslosoft/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"
此元数据已缓存,因此无需解析注解的开销。