@@ -1276,6 +1276,87 @@ function allowed()
1276
1276
compliant
1277
1277
nowdoc
1278
1278
COMPLIANT;
1279
+ ```
1280
+
1281
+ ## 11. Attributes
1282
+
1283
+ ### 12.1 Basics
1284
+
1285
+ Attribute names must immediately follow the opening attribute block indicator `#[` with no space.
1286
+
1287
+ If an attribute has no arguments, the `()` MUST be omitted.
1288
+
1289
+ The closing attribute block indicator `]` MUST follow the last character of the attribute name or the closing `)` of
1290
+ its argument list, with no preceding space.
1291
+
1292
+ ### 12.2 Placement
1293
+
1294
+ Attributes on classes, methods, functions, constants and properties MUST
1295
+ be placed on their own line, immediately prior to the structure being described.
1296
+
1297
+ For attributes on parameters, if the parameter list is presented on a single line,
1298
+ the attribute MUST be placed inline with the parameter it describes, separated by a single space.
1299
+ If the parameter list is split into multiple lines for any reason, the attribute MUST be placed on
1300
+ its own line prior to the parameter, indented the same as the parameter.
1301
+
1302
+ If a comment docblock is present on a structure that also includes an attribute, the comment block MUST
1303
+ come first, followed by any attributes, followed by the structure itself. There MUST NOT be any blank lines
1304
+ between the docblock and attributes, or the attributes and the structure.
1305
+
1306
+ If two separate attribute blocks (denoted by separate `#[]` markers) are used in a multi-line context,
1307
+ they MUST be on separate lines with no blank lines between them.
1308
+
1309
+ ### 12.3 Compound attributes
1310
+
1311
+ Multiple attributes MAY be placed in the same attribute block (`#[]`) if and only if the entire block is listed on a
1312
+ single line. They must be separated by a comma with a space following but no space preceding. If the attribute list
1313
+ is split into multiple lines for any reason, then the attributes MUST be placed in separate attribute blocks.
1314
+ Those blocks may themselves contain multiple attributes provided this rule is respected.
1315
+
1316
+ If an attribute ' s argument list is split into multiple lines for any reason, then:
1317
+
1318
+ * The attribute MUST be the only one in its attribute block.
1319
+ * The attribute arguments MUST follow the same rules as defined for multiline function calls.
1320
+
1321
+ ### 12.4 Example
1322
+
1323
+ The following is an example of valid attribute usage.
1324
+
1325
+ ```php
1326
+ #[Foo]
1327
+ #[Bar(' baz ' )]
1328
+ class Demo
1329
+ {
1330
+ #[Beep]
1331
+ private Foo $foo;
1332
+
1333
+ /**
1334
+ * Sets the foo.
1335
+ */
1336
+ #[Poink(' narf ' ), Narf(' poink ' )]
1337
+ public function setFoo(#[Beep] Foo $new): void
1338
+ {
1339
+ // ...
1340
+ }
1341
+
1342
+ #[Complex(
1343
+ prop: ' val ' ,
1344
+ other: 5,
1345
+ )]
1346
+ #[Other, Stuff, Here]
1347
+ public function complicated(
1348
+ string $a,
1349
+ #[Decl]
1350
+ string $b,
1351
+ #[Complex(
1352
+ prop: ' val ' ,
1353
+ other: 5,
1354
+ )]
1355
+ string $c,
1356
+ int $d,
1357
+ ): string {
1358
+ // ...
1359
+ }
1279
1360
}
1280
1361
```
1281
1362
0 commit comments