2.10PHP语言的特性(Attribute)类

1.特性(Attribute)类声明

声明一个特性类,首先从全局命名空间 use 导入 #[Attribute] 特性,然后在普通类声明上添加 #[Attribute] 特性以表示此类为特性类。

// a.php
namespace MyExample;

use Attribute;

#[Attribute]
class MyAttribute
{
    const VALUE = 'value';

    private $value;

    public function __construct($value = null)
    {
        $this->value = $value;
    }
}
#[Attribute(Attribute::TARGET_METHOD)]
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
特性目标描述
Attribute::TARGET_ALL不限制用于具体哪一个。
Attribute::TARGET_CLASS只可用于类。
Attribute::TARGET_PROPERTY只可用于类的属性。
Attribute::TARGET_PARAMETER只可用于函数或方法的形参。
Attribute::TARGET_CLASS_CONSTANT只可用于类常量。
Attribute::TARGET_FUNCTION只可用于函数。
Attribute::TARGET_METHOD只可用于类的方法。
Attribute::IS_REPEATABLE表示是否可重复使用。

2.使用特性

特性名会被解析为类名,特性的实参会被传递给类的构造函数。

#[] 内可以包含一个或多个特性,多个特性之间用逗号 , 分隔。

特性名称可以是完全限定名称、限定名称、非限定名称。

实参需包含在圆括号内 () 内,如果没有实参,可以省略圆括号。

实参只能是字面量或常量表达式。

实参的传递不仅支持按位置从左往右依次传递方式,还支持按命名传递方式。

// b.php
namespace Another;

use MyExample\MyAttribute;

//单个特性
#[MyAttribute]
#[\MyExample\MyAttribute]
#[MyAttribute(1234)]
#[MyAttribute(value: 1234)]
#[MyAttribute(MyAttribute::VALUE)]
#[MyAttribute(array("key" => "value"))]
#[MyAttribute(100 + 200)]
class Thing
{
}

//多个特性
#[MyAttribute(1234), MyAttribute(5678)]
class AnotherThing
{
}

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/28901.html

(0)
上一篇 2023年7月9日
下一篇 2023年7月11日

相关推荐

  • 1.3PHP语言的标识符(Identifier)

    1.标识符 标识符必须以字母(A~Z 和 a~z)或 下划线(_) 开头,后续可以是任何字母(A~Z 和 a~z)、数字(0~9)或 下划线(_)。除了函数名外,标识符都区分大小写。 2.命名约定

    PHP语言教程 2023年6月3日
    0160
  • 2.1PHP语言的命名空间(Namespace)

    1.命名空间声明 命名空间声明必须在文件中的顶部,在命名空间声明之前不可以有 PHP 代码、非 PHP 代码(例如:HTML、空白符等),除了declare 语言结构的 encoding 指令。 尽管任何有效的 PHP 代码都可以包含在命名空间体中,但受命名空间影响的只有这些元素:类(包括抽象类)、接口、trait、常…

    PHP语言教程 2023年7月1日
    0200
  • 2.7PHP类型之枚举(Enum)

    枚举(Enum)本质上也是一个类。 枚举体可以包含常量、静态方法、实例方法、魔术方法(仅支持 __call()、__callStatic()、__invoke()),不可以有 静态属性、实例属性、构造函数、析构函数。 枚举是隐式的 final 类,不可以继承。 枚举不可以像类一样直接使用 new 实例化,条目(case…

    PHP语言教程 2023年7月7日
    0190

发表回复

登录后才能评论