reedware/is-attribute

添加检查类是否为属性的布尔测试辅助函数。

v1.0.0 2023-06-25 20:00 UTC

This package is auto-updated.

Last update: 2024-08-25 22:24:44 UTC


README

Automated Tests Coding Standards Code Coverage Static Analysis Latest Stable Version

本包添加了一个布尔测试辅助函数,用于检查类是否为属性。

简介

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