PHP Conference Japan 2024

属性语法

属性语法包含几个部分。首先,属性声明总是用起始的 #[ 和相应的结束符 ] 包围。在里面,列出了一个或多个属性,用逗号分隔。属性名称是一个非限定名、限定名或完全限定名,如 使用命名空间基础 中所述。属性的参数是可选的,但包含在通常的括号 () 中。属性的参数只能是字面值或常量表达式。可以使用位置参数和命名参数语法。

当通过反射 API 请求属性实例时,属性名称及其参数将解析为一个类,参数将传递给其构造函数。因此,应该为每个属性引入一个类。

示例 #1 属性语法

<?php
// a.php
命名空间 MyExample;

使用
Attribute;

#[
Attribute]
MyAttribute
{
常量
VALUE = 'value';

私有
$value;

公共函数
__construct($value = null)
{
$this->value = $value;
}
}

// b.php

命名空间 Another;

使用
MyExample\MyAttribute;

#[
MyAttribute]
#[
\MyExample\MyAttribute]
#[
MyAttribute(1234)]
#[
MyAttribute(value: 1234)]
#[
MyAttribute(MyAttribute::VALUE)]
#[
MyAttribute(array("key" => "value"))]
#[
MyAttribute(100 + 200)]
Thing
{
}

#[
MyAttribute(1234), MyAttribute(5678)]
AnotherThing
{
}
添加备注

用户贡献的备注 1 条备注

3
yarns dot purport0n at icloud dot com
11 个月前
有一段时间我不太明白,但你可以继承属性

https://3v4l.org/TrMTe

<?php

#[Attribute(Attribute::TARGET_PROPERTY)]
PropertyAttributes
{
公共函数
__construct(
公共只读 ?
string $name = null,
公共只读 ?
string $label = null,
) {}
}

#[
Attribute(Attribute::TARGET_PROPERTY)]
IntegerPropertyAttributes 扩展 PropertyAttributes
{
公共函数
__construct(
?
string $name = null,
?
string $label = null,
公共只读 ?
int $default = null,
公共只读 ?
int $min = null,
公共只读 ?
int $max = null,
公共只读 ?
int $step = null,
) {
parent::__construct($name, $label);
}
}

#[
Attribute(Attribute::TARGET_PROPERTY)]
FloatPropertyAttributes 扩展 PropertyAttributes
{
公共函数
__construct(
?
string $name = null,
?
string $label = null,
公共只读 ?
float $default = null,
公共只读 ?
float $min = null,
公共只读 ?
float $max = null,
) {
parent::__construct($name, $label);
}
}

MyClass
{
#[
IntegerPropertyAttributes('prop', 'property: ', 5, 0, 10, 1)]
公共
int $prop;
}

$refl = new ReflectionProperty('MyClass', 'prop');
$attributes = $refl->getAttributes();

遍历 (
$attributes 作为 $attribute) {
var_dump($attribute->getName());
var_dump($attribute->getArguments());
var_dump($attribute->newInstance());
}
?>
To Top