reedware / is-attribute
添加检查类是否为属性的布尔测试辅助函数。
v1.0.0
2023-06-25 20:00 UTC
Requires
- php: >=8.0
Requires (Dev)
- laravel/pint: ^1.10
- pestphp/pest: ^2.6
- phpstan/phpstan: ^1.4.7
This package is auto-updated.
Last update: 2024-08-25 22:24:44 UTC
README
本包添加了一个布尔测试辅助函数,用于检查类是否为属性。
简介
PHP 属性是在PHP 8.0中引入的。从文档中可以看到,属性的定义方式类似于类
#[Attribute] class SetUp { // }
然而,如果你被提供了一个类的名称,就没有很好的方法知道这个类是否是PHP属性。这就是这个包中定义的is_attribute()
方法的作用所在。
安装
使用Composer安装此包
composer require reedware/is-attribute
用法
function is_attribute(string|object|null $class, ?int $target = null, int $match = TARGET_MATCH_EQUALS): bool
类参数
让我们从基础知识开始。对于更多的用例,你只需要向is_attribute()
传递一个参数,即类本身。
下面是一个例子
echo is_attribute(SetUp::class); // true echo is_attribute(CopyFile::class); // false
目标参数
如果你关心属性支持的目标,这里就有了一个可选的第二个参数。
例如,你可以这样定义一个属性
#[Attribute(Attribute::TARGET_CLASS_CONSTANT|Attribute::TARGET_PROPERTY)] class Serialize { // }
这定义了一个可以应用于类或属性的Serialize
属性。
要检查属性是否可以应用于类或属性,你可以将目标作为is_attribute
的第二个参数传递
echo is_attribute(Serialize::class, Attribute::TARGET_CLASS_CONSTANT|Attribute::TARGET_PROPERTY); // true
注意,检查一个或另一个都会返回false
echo is_attribute(Serialize::class, Attribute::TARGET_CLASS_CONSTANT); // false echo is_attribute(Serialize::class, Attribute::TARGET_PROPERTY); // false
当第二个参数未指定(例如null
)时,指定的类必须简单地是一个属性,而不管目标是什么。这与将Attribute::TARGET_ALL
作为第二个参数传递不同,这将要求属性指定所有目标(这是默认值)。
echo is_attribute(Serialize::class, Attribute::TARGET_ALL); // false
这是因为第二个参数必须是属性的一个精确匹配。
匹配参数
如果你不想进行精确匹配,可以使用可选的第三个参数。
TARGET_MATCH_EQUALS
这是第三个参数的默认值,并表现出上述已描述的行为。
TARGET_MATCH_INCLUDES
此匹配设置要求提供的所有目标都必须包含在内(例如,and/合取)。
echo is_attribute(Serialize::class, Attribute::TARGET_CLASS_CONSTANT, TARGET_MATCH_INCLUDES); // true echo is_attribute(Serialize::class, Attribute::TARGET_PROPERTY, TARGET_MATCH_INCLUDES); // true echo is_attribute(Serialize::class, Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER, TARGET_MATCH_INCLUDES); // false
TARGET_MATCH_ANY
此匹配设置要求包含提供的任何目标(例如,or/析取)。
echo is_attribute(Serialize::class, Attribute::TARGET_CLASS_CONSTANT, TARGET_MATCH_INCLUDES); // true echo is_attribute(Serialize::class, Attribute::TARGET_PROPERTY, TARGET_MATCH_INCLUDES); // true echo is_attribute(Serialize::class, Attribute::TARGET_PROPERTY | Attribute::TARGET_PARAMETER, TARGET_MATCH_INCLUDES); // true