003_ast_nodes.phpt 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. --TEST--
  2. Attributes can deal with AST nodes.
  3. --FILE--
  4. <?php
  5. define('V1', strtoupper(php_sapi_name()));
  6. #[A1([V1 => V1])]
  7. class C1
  8. {
  9. public const BAR = 'bar';
  10. }
  11. $ref = new \ReflectionClass(C1::class);
  12. $attr = $ref->getAttributes();
  13. var_dump(count($attr));
  14. $args = $attr[0]->getArguments();
  15. var_dump(count($args), $args[0][V1] === V1);
  16. echo "\n";
  17. #[A1(V1, 1 + 2, C1::class)]
  18. class C2 { }
  19. $ref = new \ReflectionClass(C2::class);
  20. $attr = $ref->getAttributes();
  21. var_dump(count($attr));
  22. $args = $attr[0]->getArguments();
  23. var_dump(count($args));
  24. var_dump($args[0] === V1);
  25. var_dump($args[1] === 3);
  26. var_dump($args[2] === C1::class);
  27. echo "\n";
  28. #[A1(self::FOO, C1::BAR)]
  29. class C3
  30. {
  31. private const FOO = 'foo';
  32. }
  33. $ref = new \ReflectionClass(C3::class);
  34. $attr = $ref->getAttributes();
  35. var_dump(count($attr));
  36. $args = $attr[0]->getArguments();
  37. var_dump(count($args));
  38. var_dump($args[0] === 'foo');
  39. var_dump($args[1] === C1::BAR);
  40. echo "\n";
  41. #[ExampleWithShift(4 >> 1)]
  42. class C4 {}
  43. $ref = new \ReflectionClass(C4::class);
  44. var_dump($ref->getAttributes()[0]->getArguments());
  45. echo "\n";
  46. #[Attribute]
  47. class C5
  48. {
  49. public function __construct() { }
  50. }
  51. $ref = new \ReflectionFunction(#[C5(MissingClass::SOME_CONST)] function () { });
  52. $attr = $ref->getAttributes();
  53. var_dump(count($attr));
  54. try {
  55. $attr[0]->getArguments();
  56. } catch (\Error $e) {
  57. var_dump($e->getMessage());
  58. }
  59. try {
  60. $attr[0]->newInstance();
  61. } catch (\Error $e) {
  62. var_dump($e->getMessage());
  63. }
  64. ?>
  65. --EXPECT--
  66. int(1)
  67. int(1)
  68. bool(true)
  69. int(1)
  70. int(3)
  71. bool(true)
  72. bool(true)
  73. bool(true)
  74. int(1)
  75. int(2)
  76. bool(true)
  77. bool(true)
  78. array(1) {
  79. [0]=>
  80. int(2)
  81. }
  82. int(1)
  83. string(30) "Class "MissingClass" not found"
  84. string(30) "Class "MissingClass" not found"