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