PHP 8.5.0 RC4 available for testing

Declaración de clases de atributos

Se recomienda definir una clase separada para cada atributo. En el caso más simple, una clase vacía con la declaración #[Attribute] es suficiente. El atributo puede ser importado desde el espacio de nombres global utilizando una declaración use.

Ejemplo #1 Clase de atributo simple

<?php

namespace Example;

use
Attribute;

#[
Attribute]
class
MyAttribute
{
}

Para restringir los tipos de declaraciones a los que se puede aplicar un atributo, pasa una máscara de bits como primer argumento en la declaración #[Attribute]

Ejemplo #2 Usar la especificación de destino para restringir dónde se pueden usar los atributos

<?php

namespace Example;

use
Attribute;

#[
Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
class
MyAttribute
{
}

Declarar MyAttribute en otro tipo ahora generará una excepción durante la llamada a ReflectionAttribute::newInstance()

Los siguientes destinos se pueden especificar:

Por defecto, un atributo solo se puede usar una vez por declaración. Para permitir que un atributo sea repetible, especifícalo en la máscara de bits de la declaración #[Attribute] utilizando el flag Attribute::IS_REPEATABLE

Ejemplo #3 Usar IS_REPEATABLE para permitir que un atributo se use varias veces en una declaración

<?php

namespace Example;

use
Attribute;

#[
Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class
MyAttribute
{
}
add a note

User Contributed Notes 1 note

up
13
esdras-schonevald
3 years ago
#! Require PHP >= 8.0

#! This is a Sample

<?php

declare(strict_types = 1);

#[
Attribute]
class
Foo
{
function
__construct(){
echo
"Running " . __METHOD__ . PHP_EOL;
}
}

#[
Attribute(Attribute::TARGET_CLASS|Attribute::IS_REPEATABLE)]
class
Bar {
function
__construct(?string ...$args){
echo
"Running " . __METHOD__ ,
" args: " . implode(", ", $args) . PHP_EOL;
}
}

#[
Attribute(Attribute::TARGET_ALL)]
class
Baz {
function
__construct(
private
string $parameter
){
echo
"Running " . __METHOD__ ,
" arg: " . $this->parameter . PHP_EOL;
}
}

#[
Foo] // [0]
#[Bar] // [1]
#[Bar("Banana")] // [2]
#[Bar("Banana", "Apple", "Lemon", "Grape")] // [3]
#[Baz("The Only One")] // [4]
class Qux
{
}

// Getting class attribute with ReflectionClass
$ref = new ReflectionClass(Qux::class);
$attrs = $ref->getAttributes(); // Array of attributes

$attrs[0]->newInstance(); // "Running Foo::__construct"
$attrs[1]->newInstance(); // "Running Bar::__construct args: "
$attrs[2]->newInstance(); // "Running Bar::__construct args: Banana"
$attrs[3]->newInstance(); // "Running Bar::__construct args: Banana, Apple, Lemon, Grape"
$attrs[4]->newInstance(); // "Running Baz::__construct arg: The Only One"
To Top