Atribut PHP, yang diperkenalkan dalam Php 8, menawarkan cara deklaratif untuk menambah metadata kepada kelas, kaedah, fungsi, parameter, dan sifat. Mereka boleh digunakan sebagai pengganti komen phpDoc, yang sebelum ini merupakan cara standard untuk menyediakan metadata. Inilah cara menggunakannya:
Untuk menentukan atribut tersuai, anda membuat kelas dengan atribut #[Attribute]
dan tentukan di mana ia boleh digunakan (misalnya, TARGET_CLASS
, TARGET_METHOD
).
<code class="php">#[Attribute(Attribute::TARGET_CLASS)] class MyAttribute { public function __construct(public string $value) {} } #[MyAttribute('example')] class MyClass { // Class implementation }</code>
Anda boleh mengambil atribut semasa runtime menggunakan refleksi:
<code class="php">$reflectionClass = new ReflectionClass(MyClass::class); $attributes = $reflectionClass->getAttributes(MyAttribute::class); foreach ($attributes as $attribute) { $instance = $attribute->newInstance(); echo $instance->value; // Outputs: example }</code>
Atribut PHP meningkatkan kebolehbacaan dan kebolehkerjaan kod dalam beberapa cara:
Atribut menawarkan sintaks yang lebih berstruktur dan boleh dibaca berbanding dengan komen phpDoc. Mereka adalah sebahagian daripada bahasa PHP itu sendiri, menjadikannya lebih mudah bagi pemaju untuk memahami metadata apa yang digunakan untuk kelas atau kaedah tanpa perlu menghuraikan komen.
<code class="php">// Less readable PHPDoc comment /** * @Route("/example") */ class MyClass {} // More readable attribute #[Route('/example')] class MyClass {}</code>
Kerana atribut adalah kelas, mereka mendapat manfaat daripada pemeriksaan jenis dan autocompletion dalam IDE moden. Ini mengurangkan kesilapan dan meningkatkan kecekapan pembangunan.
Atribut membolehkan metadata ditakrifkan di satu tempat (definisi kelas), menjadikannya lebih mudah untuk mengekalkan dan mengubah suai. Pemusatan ini mengurangkan peluang ketidakkonsistenan dan menjadikan codebase lebih dapat dipelihara.
Banyak rangka dan perpustakaan PHP moden boleh memanfaatkan atribut untuk penghalaan, pengesahan, siri, dan banyak lagi, menyelaraskan pembangunan aplikasi dan konfigurasi.
Atribut PHP boleh digunakan dalam pelbagai senario praktikal:
Dalam rangka kerja seperti Laravel atau Symfony, atribut boleh digunakan untuk menentukan laluan secara langsung pada kaedah pengawal, meningkatkan kejelasan dan mengekalkan konfigurasi penghalaan.
<code class="php">use Symfony\Component\Routing\Annotation\Route; class BlogController { #[Route('/blog/{slug}', name: 'blog_show')] public function show(string $slug): Response { // Implementation } }</code>
Atribut boleh menentukan peraturan pengesahan secara langsung pada sifat, memudahkan proses memastikan integriti data.
<code class="php">use Symfony\Component\Validator\Constraints as Assert; class User { #[Assert\NotBlank] #[Assert\Email] public $email; }</code>
Dalam API, atribut dapat mengawal bagaimana objek bersiri kepada JSON atau format lain.
<code class="php">use JMS\Serializer\Annotation as Serializer; class Product { #[Serializer\SerializedName('product_id')] public $id; #[Serializer\Exclude] public $internalData; }</code>
Atribut boleh digunakan untuk menentukan tingkah laku pembalakan, seperti kaedah apa yang harus dilog masuk dan pada tahap apa.
<code class="php">use App\Logging\Annotation\Loggable; class UserService { #[Loggable(level: 'info')] public function createUser(User $user): void { // Implementation } }</code>
Ya, atribut PHP boleh digunakan untuk melaksanakan suntikan ketergantungan, terutamanya dalam rangka moden yang menyokong konfigurasi berasaskan atribut. Inilah caranya boleh dilakukan:
Pertama, tentukan kelas atribut yang akan digunakan untuk menandakan parameter untuk suntikan.
<code class="php">#[Attribute(Attribute::TARGET_PARAMETER)] class Inject { public function __construct(public string $service) {} }</code>
Kemudian, gunakan atribut pada parameter pembina atau parameter kaedah untuk menunjukkan perkhidmatan mana yang harus disuntik.
<code class="php">class UserService { private $logger; public function __construct( #[Inject('LoggerInterface')] LoggerInterface $logger ) { $this->logger = $logger; } public function createUser(User $user): void { $this->logger->info('Creating user'); // Implementation } }</code>
Akhirnya, anda memerlukan bekas suntikan ketergantungan yang boleh memproses atribut ini dan menyuntik perkhidmatan yang betul. Inilah contoh yang mudah mengenai bagaimana bekas mungkin berfungsi:
<code class="php">class Container { public function get($className) { $reflectionClass = new ReflectionClass($className); $constructor = $reflectionClass->getConstructor(); if (!$constructor) { return new $className; } $parameters = $constructor->getParameters(); $dependencies = []; foreach ($parameters as $parameter) { $attribute = $parameter->getAttributes(Inject::class)[0] ?? null; if ($attribute) { $injectAttribute = $attribute->newInstance(); $dependencies[] = $this->get($injectAttribute->service); } else { $dependencies[] = $this->get($parameter->getType()->getName()); } } return $reflectionClass->newInstanceArgs($dependencies); } }</code>
Dalam contoh ini, kelas Container
menggunakan refleksi untuk memeriksa parameter pembina dan atribut mereka. Jika atribut Inject
dijumpai, ia menyelesaikan perkhidmatan yang ditentukan dan menyuntikkannya ke dalam contoh baru.
Dengan menggunakan atribut untuk suntikan ketergantungan, anda boleh memastikan kod anda bersih dan memberi tumpuan kepada logik perniagaan sambil membenarkan bekas untuk mengendalikan pendawaian dependensi. Pendekatan ini meningkatkan kebolehbacaan dan pemeliharaan permohonan anda.
Atas ialah kandungan terperinci Atribut PHP (anotasi): penggunaan dan contoh.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!