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 λ₯Ό μ΄μš©ν•΄μ„œ λΌμš°νŒ…μ„ 관리해 μ€˜λ„ λ©λ‹ˆλ‹€.

같이 보기

Ref