gh8421.phpt 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. --TEST--
  2. Bug GH-8421: Attributes that target functions are not valid for anonymous functions defined within a method
  3. --FILE--
  4. <?php
  5. #[Attribute(Attribute::TARGET_FUNCTION)]
  6. class FunctionAttribute
  7. {
  8. public int $number = 1;
  9. }
  10. $globalClosure = #[FunctionAttribute]
  11. fn() => true;
  12. $globalStaticClosure = #[FunctionAttribute]
  13. static fn() => true;
  14. class ClosureHolder
  15. {
  16. public function getClosureDefinedInScope(): Closure
  17. {
  18. return #[FunctionAttribute]
  19. fn() => true;
  20. }
  21. public function getStaticClosureDefinedInScope(): Closure
  22. {
  23. return #[FunctionAttribute]
  24. static fn() => true;
  25. }
  26. public static function getClosureDefinedInScopeStatically(): Closure
  27. {
  28. return #[FunctionAttribute]
  29. fn() => true;
  30. }
  31. public static function getStaticClosureDefinedInScopeStatically(): Closure
  32. {
  33. return #[FunctionAttribute]
  34. static fn() => true;
  35. }
  36. }
  37. var_dump((new ReflectionFunction($globalClosure))->getAttributes(FunctionAttribute::class)[0]->newInstance()->number);
  38. var_dump((new ReflectionFunction($globalStaticClosure))->getAttributes(FunctionAttribute::class)[0]->newInstance()->number);
  39. var_dump((new ReflectionFunction(ClosureHolder::getClosureDefinedInScopeStatically()))->getAttributes(FunctionAttribute::class)[0]->newInstance()->number);
  40. var_dump((new ReflectionFunction(ClosureHolder::getStaticClosureDefinedInScopeStatically()))->getAttributes(FunctionAttribute::class)[0]->newInstance()->number);
  41. $holder = new ClosureHolder;
  42. var_dump((new ReflectionFunction($holder->getClosureDefinedInScope()))->getAttributes(FunctionAttribute::class)[0]->newInstance()->number);
  43. var_dump((new ReflectionFunction($holder->getStaticClosureDefinedInScope()))->getAttributes(FunctionAttribute::class)[0]->newInstance()->number);
  44. ?>
  45. --EXPECT--
  46. int(1)
  47. int(1)
  48. int(1)
  49. int(1)
  50. int(1)
  51. int(1)