Open1

Emacs PHP ModeでPHP 8の #[Attribute] をサポートする

にゃんだーすわんにゃんだーすわん

PHP 8 Syntax

いろいろあって、PHP: rfc:shorter_attribute_syntax_changeの投票により #[Attributes] 形式になった。

#はPHP7では単なるコメントなので(改行位置を選べば)後方互換性を崩さずに導入できるという利点がある。

<?php

#[Attribute]
class MyAttr
{
    private array $args;

    public function __construct(...$args)
    {
        $this->args = $args;
    }
    
    public function getArgs(): array
    {
        return $this->args;
    }
}

#[MyAttr('class', 1)]
class Target
{
    #[MyAttr('method', 2)]
    public function method(#[MyAttr('arg', 3)] $arg)
    {
    }
}

$ref = new ReflectionClass(Target::class);
foreach ($ref->getAttributes(MyAttr::class) as $attr) {
    var_dump($attr->newInstance());
}

$ref_method = $ref->getMethod('method');
foreach ($ref_method->getAttributes(MyAttr::class) as $attr) {
    var_dump($attr->newInstance());
}

$ref_param = $ref_method->getParameters()[0];
foreach ($ref_param->getAttributes(MyAttr::class) as $attr) {
    var_dump($attr->newInstance());
}