Saya memiliki atribut sebagai berikut:

#[Attribute]
class State{
    public function __constractor(
        public string $name
    ){}
}

Saya ingin menambahkan beberapa negara bagian ke kelas saya sebagai berikut:

#[
   State('a'),
   State('b')
]
class StateMachine{}

Setiap hal baik-baik saja dan saya dapat mengakses daftar atribut sebagai berikut:

$attrs = $classReflection->getAttributes(State::class);

Tetapi masalahnya adalah, setiap kali saya mencoba untuk instan salah satunya, kesalahan yang dilemparkan:

$instance = $attrs[0]->newInstance();

Kesalahannya adalah:

Error: Attribute "State" must not be repeated

Ada ide?

2
Mostafa 5 April 2021, 06:48

1 menjawab

Jawaban Terbaik

Menurut dokumentasi resmi Anda harus mendefinisikan atribut Anda secara berbeda untuk dapat melakukannya dengan cara itu. Saya menggunakan phpstorm untuk memverifikasi asumsi saya dan ini harus berfungsi:

define atribut

use Attribute;

#[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_CLASS)]
class State{
    public function __construct(
        public string $name
    ){}
}

Bagian penting di sini adalah definisi Attribute::IS_REPEATABLE. Untuk membuatnya bekerja untuk kelas, Anda juga perlu menggunakan Attribute::TARGET_CLASS.

Menurut DOCS Anda juga harus meletakkan semuanya dalam satu baris, Saat menerapkan atribut:

#[State('a'), State('b')]
class StateMachine{}
3
jumper85 5 April 2021, 08:31