Updated PHP Windows builds for Brotli security fix

Deklaration von Attributklassen

Es ist empfehlenswert, für jedes Attribut eine eigene Klasse zu definieren. Im einfachsten Fall genügt eine leere Klasse, in der das Attribut #[Attribute] deklariert wird. Das Attribut kann mit einer use-Anweisung aus dem globalen Namensraum importiert werden.

Beispiel #1 Einfache Attributklasse

<?php

namespace Example;

use Attribute;

#[Attribute]
class MyAttribute
{
}

Um die Arten der Deklarationen einzuschränken, auf die ein Attribut angewendet werden kann, kann eine Bitmaske als erstes Argument an die #[Attribute]-Deklaration übergeben werden.

Beispiel #2 Verwendung der Zielspezifikation, um die Verwendung von Attributen zu beschränken

<?php

namespace Example;

use Attribute;

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

Wenn MyAttribute für einen anderen Typ deklariert wird, wird nun beim Aufruf von ReflectionAttribute::newInstance() eine Exception ausgelöst.

Die folgenden Ziele können angegeben werden:

Standardmäßig kann ein Attribut nur einmal pro Deklaration verwendet werden. Damit ein Attribut wiederholbar ist, muss es in der Bitmaske der #[Attribut]-Deklaration mit dem Flag Attribute::IS_REPEATABLE angegeben werden.

Beispiel #3 Verwendung von IS_REPEATABLE um ein Attribut mehrfach in einer Deklaration zu erlauben

<?php

namespace Example;

use Attribute;

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

User Contributed Notes 2 notes

up
16
esdras-schonevald
4 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"
up
1
1205784393 at qq dot com
2 months ago
Attention,using Attribute does not necessarily require defining an Attribute class!

<?php

namespace Example;

use Attribute;

//#[Attribute]
//class MyAttribute
//{
//    public function __construct(private string $name, private int $age)
//    {
//
//    }
//}

#[MyAttribute('Knight', 56)]
class Person
{

}

function dumpAttributeData(\ReflectionClass $reflection)
{
    $attributes = $reflection->getAttributes();
    
    foreach ($attributes as $attribute) {
        var_dump($attribute->getName());
        var_dump($attribute->getArguments());
//        var_dump($attribute->newInstance());
    }
}

dumpAttributeData(new \ReflectionClass(Person::class));

// PS C:\Users\Administrator\Desktop> php .\index.php
//  string(19) "Example\MyAttribute"
//       array(2) {
//                 [0]=> string(6) "Knight"
//                 [1]=> int(56)
//       }
To Top