1--TEST-- 2Property type hints in PHP 7.4 3--SKIPIF-- 4<?php if (PHP_VERSION_ID < 70400) die('skip PHP >= 7.4 only'); ?> 5--FILE-- 6<?php 7 8require __DIR__ . '/../util.php'; 9 10$code = <<<'PHP' 11<?php 12namespace Foo; 13class test { 14 public int $i = 2, $j; 15 public static ?string $s; 16 private ?iterable $it; 17 protected Row $row; 18 var \stdClass $o; 19 private static $normal = null; 20} 21PHP; 22 23$node = ast\parse_code($code, $version=60); 24echo "The type property should not be set in version 60\n"; 25echo ast_dump($node), "\n"; 26echo "But the type property should be set in version 70\n"; 27$node = ast\parse_code($code, $version=70); 28echo ast_dump($node), "\n"; 29?> 30--EXPECTF-- 31The type property should not be set in version 60 32AST_STMT_LIST 33 0: AST_NAMESPACE 34 name: "Foo" 35 stmts: null 36 1: AST_CLASS 37 flags: 0 38 name: "test" 39 docComment: null 40 extends: null 41 implements: null 42 stmts: AST_STMT_LIST 43 0: AST_PROP_DECL 44 flags: MODIFIER_PUBLIC (%d) 45 0: AST_PROP_ELEM 46 name: "i" 47 default: 2 48 docComment: null 49 1: AST_PROP_ELEM 50 name: "j" 51 default: null 52 docComment: null 53 1: AST_PROP_DECL 54 flags: MODIFIER_PUBLIC | MODIFIER_STATIC (%d) 55 0: AST_PROP_ELEM 56 name: "s" 57 default: null 58 docComment: null 59 2: AST_PROP_DECL 60 flags: MODIFIER_PRIVATE (%d) 61 0: AST_PROP_ELEM 62 name: "it" 63 default: null 64 docComment: null 65 3: AST_PROP_DECL 66 flags: MODIFIER_PROTECTED (%d) 67 0: AST_PROP_ELEM 68 name: "row" 69 default: null 70 docComment: null 71 4: AST_PROP_DECL 72 flags: MODIFIER_PUBLIC (%d) 73 0: AST_PROP_ELEM 74 name: "o" 75 default: null 76 docComment: null 77 5: AST_PROP_DECL 78 flags: MODIFIER_PRIVATE | MODIFIER_STATIC (%d) 79 0: AST_PROP_ELEM 80 name: "normal" 81 default: AST_CONST 82 name: AST_NAME 83 flags: NAME_NOT_FQ (1) 84 name: "null" 85 docComment: null 86 __declId: 0 87But the type property should be set in version 70 88AST_STMT_LIST 89 0: AST_NAMESPACE 90 name: "Foo" 91 stmts: null 92 1: AST_CLASS 93 flags: 0 94 name: "test" 95 docComment: null 96 extends: null 97 implements: null 98 stmts: AST_STMT_LIST 99 0: AST_PROP_GROUP 100 flags: MODIFIER_PUBLIC (%d) 101 type: AST_TYPE 102 flags: TYPE_LONG (4) 103 props: AST_PROP_DECL 104 flags: 0 105 0: AST_PROP_ELEM 106 name: "i" 107 default: 2 108 docComment: null 109 1: AST_PROP_ELEM 110 name: "j" 111 default: null 112 docComment: null 113 1: AST_PROP_GROUP 114 flags: MODIFIER_PUBLIC | MODIFIER_STATIC (%d) 115 type: AST_NULLABLE_TYPE 116 type: AST_TYPE 117 flags: TYPE_STRING (6) 118 props: AST_PROP_DECL 119 flags: 0 120 0: AST_PROP_ELEM 121 name: "s" 122 default: null 123 docComment: null 124 2: AST_PROP_GROUP 125 flags: MODIFIER_PRIVATE (%d) 126 type: AST_NULLABLE_TYPE 127 type: AST_TYPE 128 flags: TYPE_ITERABLE (%d) 129 props: AST_PROP_DECL 130 flags: 0 131 0: AST_PROP_ELEM 132 name: "it" 133 default: null 134 docComment: null 135 3: AST_PROP_GROUP 136 flags: MODIFIER_PROTECTED (%d) 137 type: AST_NAME 138 flags: NAME_NOT_FQ (1) 139 name: "Row" 140 props: AST_PROP_DECL 141 flags: 0 142 0: AST_PROP_ELEM 143 name: "row" 144 default: null 145 docComment: null 146 4: AST_PROP_GROUP 147 flags: MODIFIER_PUBLIC (%d) 148 type: AST_NAME 149 flags: NAME_FQ (0) 150 name: "stdClass" 151 props: AST_PROP_DECL 152 flags: 0 153 0: AST_PROP_ELEM 154 name: "o" 155 default: null 156 docComment: null 157 5: AST_PROP_GROUP 158 flags: MODIFIER_PRIVATE | MODIFIER_STATIC (%d) 159 type: null 160 props: AST_PROP_DECL 161 flags: 0 162 0: AST_PROP_ELEM 163 name: "normal" 164 default: AST_CONST 165 name: AST_NAME 166 flags: NAME_NOT_FQ (1) 167 name: "null" 168 docComment: null 169 __declId: 0 170