non ho trovato proprio easy capire come funzionano gli attribute.
cmq ecco un esempio basico, penso partirò da qui per quel che mi serve:
codice:
#[Attribute]
class CheckProtectedAttribute {
  private string $isProtected;


  public function __construct(string $isProtected) {
    $this->isProtected = $isProtected;
  }
}


class Foo {
  #[CheckProtectedAttribute('true')]
  public function funcProtetta() {
    echo 'protetta';
  }


  #[CheckProtectedAttribute('false')]
  public function funcNonProtetta() {
    echo 'non protetta';
  }


}


$reflector = new \ReflectionClass(Foo::class);
$methods = $reflector->getMethods();


foreach ($methods as $method) {
  foreach ($method->getAttributes() as $attr) {
    foreach ($attr->getArguments() as $arg) {
      if ($arg === 'true') {
        echo '-ESEGUIRE IL LOGIN-';
      } else {
        $reflectionMethod = new ReflectionMethod('Foo', $method->getName());
        $reflectionMethod->invoke($reflector->newInstance());
      }
    }
    echo '<hr>';
  }
}