PHP 8 μ μλ‘μ΄ κΈ°λ₯ - νΉμ±(Attribute)
κ°μ
Attribute λ λ©ν λ°μ΄ν°(meta data)λ μ μΈμ μ 보(declarative information)λ₯Ό μ½λμ μ°κ²°νλ κ°λ ₯ν λ°©λ²μ λλ€.
Java μμλ annotation μ΄λΌκ³ λΆλ₯΄λ©° C# μμλ PHP μ λ§μ°¬κ°μ§λ‘ Attribute λ‘ λͺ λͺ λμ΄ μμ΅λλ€.
Attribute λ₯ΌΒ μμ±μ΄λΌκ³ λ²μν κ³³λ μλλ° μμ±μ property μ μλ―Έκ° κ²ΉμΉλ―λ‘ μ λΉν μ©μ΄κ° μλλΌκ³ μκ°ν©λλ€.
κΈ°μ λ²μμ λ νΌλ°μ€μΈ Microsoft μ μΈμ΄ ν¬νΈ μ¬μ΄νΈλ₯Ό 보면 attribute λ₯Ό 'νΉμ±' μΌλ‘ λ²μνκ³ μμΌλ©° μ κ° μκ°νκΈ°μλ μμ±λ³΄λ€λ νΉμ±μ΄ λ μ λΉν λ¨μ΄κ°μΌλ―λ‘ μ΄ κΈμμλ Attribute λ₯Ό νΉμ±μ΄λΌκ³ μ§μΉνκ² μ΅λλ€.
PHP μ attribute λ class, method, variable, parameter λ±μ λΆμ¬ν μ μμΌλ©° compiler time κ³Ό runtime μ attribute λ₯Ό μ΄μ©ν΄μ νΉλ³ν μ²λ¦¬λ₯Ό ν μ μμ΅λλ€.
μλ‘ PHPStorm μ μ¬μ©ν κ²½μ° λΆλ³ μμ±μ κ°μ§ λ³μμ λν΄ μλμ κ°μ΄ attribute λ₯Ό μ§μ νλ©΄ μμ ν κ²½μ° IDE μμ κ°μ§ν΄μ μλ¬λ₯Ό νμνλ―λ‘ μ½λ© μ€μλ₯Ό μ€μΌ μ μμ΅λλ€.
<?php use JetBrains\PhpStorm\Immutable; class MyClass { #[Immutable] private int $read_only_var; public function setValue(int $value): void { $this->read_only_var = $value; } }
κΈ°μ‘΄μ docblocks μ @ λ₯Ό μ¬μ©ν΄μ annotation μ λ¬ κ²½μ° μ€νλ₯Ό λ΄κ±°λ μλ annotation μ μ¬μ©ν΄λ μ½λκ° μλλΌ μ£Όμμ΄λ―λ‘ IDE μμ μλ¬λ₯Ό κ°μ§νμ§ μ΄λ €μ μ΅λλ€.
Attribute λ κΈ°μ‘΄μ docblocks μ¬μ©ν μ£Όμμ λΉν΄ νμ± λ° λΆμμ΄ μ©μ΄νλ―λ‘ PHPStorm κ°μ IDE κ° λ μ ννκ² λμνλ©° phpstan μ΄λ psalm κ°μ μ μ λΆμκΈ°κ° λ μ κ΅νκ² λμνλ μ₯μ μ΄ μμ΅λλ€.
λ docblocks μ£Όμμ λ©λͺ¨λ¦¬κΉμ§ λ‘λ©ν΄μΌ νλ κΈ°μ‘΄ λ°©μμ λΉν΄ JIT μΌλ‘ μ΅μ νκ° μ©μ΄νκ³ Run time μ Reflection μ λ λΉ λ₯΄κ² ν μ μμΌλ©° μ€ν μκ°λ λ 짧μμ§μ§ μμκΉ μΆμΈ‘ν©λλ€.
Symfony λ Doctrine κ°μ μ λͺ ν PHP Framework λ Attribute λ₯Ό μ§μνλλ‘ μμ λμκ³ psalm μ΄λ phpstan λ Attribute λ₯Ό μ§μνλ λ²μ μ λ°ννμΌλ―λ‘ Attribute μ μ νμ©ν΄μ μ’μ νμ§μ μ½λλ₯Ό μμ±νλλ‘ μ°μ΅μ΄ νμν μμ μ λλ€.
λ§μ½ attribute μ νμμ±κ³Ό νμ© λ°©λ²μ΄ μ μ΄ν΄κ° λμ§ μλλ€λ©΄ C# μ΄λ Java μμ μ¬μ© λ°©λ²μ μ°Ύμ 보λ κ²λ λ§μ λμμ΄ λ©λλ€.
νΉν Spring framework λ₯Ό μ μ¬μ©νλ €λ©΄ μ΄μ§λ¬μΈ μ λλ‘ μλ§μ annotation μ νμ©ν meta programming κΈ°λ²μ΄ νμν©λλ€.
λ¬Έλ²
PHP λ νΉμ±μ λΆμ¬νλ λ¬Έλ²μΌλ‘ #[Attr] μ μ¬μ©νλλ° μ΄κ±Έλ‘ κ²°μ νκΈ°κΉμ§ μ¬λ¬ μ°μ¬ 곑μ μ΄ μμλ λ΄ λλ€.(PHP Annotated β August 2020 (haah.kr)Β μ°Έκ³ )
use App\Attributes\ExampleAttribute; #[ExampleAttribute] class Foo { #[ExampleAttribute] public const FOO = 'foo'; #[ExampleAttribute] public $x; #[ExampleAttribute] public function foo(#[ExampleAttribute] $bar) { } }
Laravel 8μ PHP 7.3 λΆν° μ§μνλ―λ‘ Attribute λ₯Ό μ λλ‘ μ§μνκ³ μμ§λ μμ΅λλ€. λμ PHP 8 λ‘ λΌλΌλ²¨μ ꡬλν κ²½μ° Attribute λ₯Ό μ¬μ©νλλ° λ¬Έμ κ° μμ΅λλ€.
μλ‘ PHP 8 μ μ¬μ©νλ€λ©΄ λΌλΌλ²¨ λΌμ°ν μ Attribute λ‘ κ΄λ¦¬νλ ν¨ν€μ§μΈ spatie/laravel-route-attributes λ₯Ό μ΄μ©ν΄μ λΌμ°ν μ κ΄λ¦¬ν΄ μ€λ λ©λλ€.