File tree Expand file tree Collapse file tree 5 files changed +92
-0
lines changed
tests/PHPStan/Rules/Constants Expand file tree Collapse file tree 5 files changed +92
-0
lines changed Original file line number Diff line number Diff line change 54
54
--exclude tests/PHPStan/Rules/Classes/data/first-class-instantiation-callable.php \
55
55
--exclude tests/PHPStan/Rules/Classes/data/instantiation-callable.php \
56
56
--exclude tests/PHPStan/Rules/Classes/data/bug-9402.php \
57
+ --exclude tests/PHPStan/Rules/Constants/data/class-as-class-constant.php \
57
58
--exclude tests/PHPStan/Rules/Constants/data/value-assigned-to-class-constant-native-type.php \
58
59
--exclude tests/PHPStan/Rules/Constants/data/overriding-constant-native-types.php \
59
60
--exclude tests/PHPStan/Rules/Methods/data/bug-10043.php \
Original file line number Diff line number Diff line change 45
45
- PHPStan\Rules\Classes\NonClassAttributeClassRule
46
46
- PHPStan\Rules\Classes\ReadOnlyClassRule
47
47
- PHPStan\Rules\Classes\TraitAttributeClassRule
48
+ - PHPStan\Rules\Constants\ClassAsClassConstantRule
48
49
- PHPStan\Rules\Constants\DynamicClassConstantFetchRule
49
50
- PHPStan\Rules\Constants\FinalConstantRule
50
51
- PHPStan\Rules\Constants\MagicConstantContextRule
Original file line number Diff line number Diff line change
1
+ <?php declare (strict_types = 1 );
2
+
3
+ namespace PHPStan \Rules \Constants ;
4
+
5
+ use PhpParser \Node ;
6
+ use PHPStan \Analyser \Scope ;
7
+ use PHPStan \Rules \Rule ;
8
+ use PHPStan \Rules \RuleErrorBuilder ;
9
+
10
+ /**
11
+ * @implements Rule<Node\Stmt\ClassConst>
12
+ */
13
+ final class ClassAsClassConstantRule implements Rule
14
+ {
15
+
16
+ public function getNodeType (): string
17
+ {
18
+ return Node \Stmt \ClassConst::class;
19
+ }
20
+
21
+ public function processNode (Node $ node , Scope $ scope ): array
22
+ {
23
+ $ errors = [];
24
+
25
+ foreach ($ node ->consts as $ const ) {
26
+ if ($ const ->name ->toLowerString () !== 'class ' ) {
27
+ continue ;
28
+ }
29
+
30
+ $ errors [] = RuleErrorBuilder::message ('A class constant must not be called \'class \'; it is reserved for class name fetching. ' )
31
+ ->line ($ const ->getStartLine ())
32
+ ->identifier ('classConstant.class ' )
33
+ ->nonIgnorable ()
34
+ ->build ();
35
+ }
36
+
37
+ return $ errors ;
38
+ }
39
+
40
+ }
Original file line number Diff line number Diff line change
1
+ <?php declare (strict_types = 1 );
2
+
3
+ namespace PHPStan \Rules \Constants ;
4
+
5
+ use PHPStan \Rules \Rule ;
6
+ use PHPStan \Testing \RuleTestCase ;
7
+
8
+ /**
9
+ * @extends RuleTestCase<ClassAsClassConstantRule>
10
+ */
11
+ class ClassAsClassConstantRuleTest extends RuleTestCase
12
+ {
13
+
14
+ protected function getRule (): Rule
15
+ {
16
+ return new ClassAsClassConstantRule ();
17
+ }
18
+
19
+ public function testRule (): void
20
+ {
21
+ $ this ->analyse ([__DIR__ . '/data/class-as-class-constant.php ' ], [
22
+ [
23
+ 'A class constant must not be called \'class \'; it is reserved for class name fetching. ' ,
24
+ 9 ,
25
+ ],
26
+ [
27
+ 'A class constant must not be called \'class \'; it is reserved for class name fetching. ' ,
28
+ 16 ,
29
+ ],
30
+ ]);
31
+ }
32
+
33
+ }
Original file line number Diff line number Diff line change
1
+ <?php
2
+
3
+ namespace ClassAsClassConstant ;
4
+
5
+ final class A
6
+ {
7
+ public const FOO = 'foo ' ;
8
+ public const BAR = 'bar ' ;
9
+ public const CLASS = 'qux ' ;
10
+ }
11
+
12
+ final class B
13
+ {
14
+ public const YES = 1 ,
15
+ NO = 0 ,
16
+ CLASS = -1 ;
17
+ }
You can’t perform that action at this time.
0 commit comments