Skip to content

Commit 5c6d6f4

Browse files
[RFC] Allow #[\Override] on class constants
1 parent b1710f4 commit 5c6d6f4

23 files changed

Lines changed: 391 additions & 4 deletions
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
#[\DelayedTargetValidation] with #[\Override]: non-overrides still error (class constant)
3+
--FILE--
4+
<?php
5+
6+
class DemoClass {
7+
8+
#[DelayedTargetValidation]
9+
#[Override] // Does something here
10+
public const CLASS_CONSTANT = 'FOO';
11+
}
12+
13+
?>
14+
--EXPECTF--
15+
Fatal error: DemoClass::CLASS_CONSTANT has #[\Override] attribute, but no matching parent constant exists in %s on line %d

Zend/tests/attributes/delayed_target_validation/with_Override_okay.phpt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class Base {
1212
set => $value;
1313
}
1414

15+
public const CLASS_CONST = '';
16+
1517
public function printVal() {
1618
echo __METHOD__ . "\n";
1719
}
@@ -34,7 +36,7 @@ class DemoClass extends Base {
3436
}
3537

3638
#[DelayedTargetValidation]
37-
#[Override] // Does nothing here
39+
#[Override] // Does something here
3840
public const CLASS_CONST = 'FOO';
3941

4042
public function __construct(
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
#[\Override]: Constants - anonymous class, no interface or parent class
3+
--FILE--
4+
<?php
5+
6+
new class () {
7+
#[\Override]
8+
public const C = 'C';
9+
};
10+
11+
echo "Done";
12+
13+
?>
14+
--EXPECTF--
15+
Fatal error: class@anonymous::C has #[\Override] attribute, but no matching parent constant exists in %s on line %d
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
#[\Override]: Constants - anonymous class overrides interface
3+
--FILE--
4+
<?php
5+
6+
interface IFace {
7+
public const I = 'I';
8+
}
9+
10+
new class () implements IFace {
11+
#[\Override]
12+
public const I = 'Changed';
13+
};
14+
15+
echo "Done";
16+
17+
?>
18+
--EXPECT--
19+
Done
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
#[\Override]: Constants - anonymous class overrides parent class
3+
--FILE--
4+
<?php
5+
6+
class Base {
7+
public const C = 'C';
8+
}
9+
10+
new class () extends Base {
11+
#[\Override]
12+
public const C = 'Changed';
13+
};
14+
15+
echo "Done";
16+
17+
?>
18+
--EXPECT--
19+
Done
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
#[\Override]: Constants - basic
3+
--FILE--
4+
<?php
5+
6+
interface I {
7+
public const I = 'I';
8+
}
9+
10+
interface II extends I {
11+
#[\Override]
12+
public const I = 'I';
13+
}
14+
15+
class P {
16+
public const C1 = 'C1';
17+
public const C2 = 'C2';
18+
}
19+
20+
class PP extends P {
21+
#[\Override]
22+
public const C1 = 'C1';
23+
public const C2 = 'C2';
24+
}
25+
26+
class C extends PP implements I {
27+
#[\Override]
28+
public const I = 'I';
29+
#[\Override]
30+
public const C1 = 'C1';
31+
public const C2 = 'C2';
32+
public const C = 'C';
33+
}
34+
35+
echo "Done";
36+
37+
?>
38+
--EXPECT--
39+
Done
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
#[\Override]: Constants - no interface or parent class
3+
--FILE--
4+
<?php
5+
6+
class Demo {
7+
#[\Override]
8+
public const C = 'C';
9+
}
10+
11+
echo "Done";
12+
13+
?>
14+
--EXPECTF--
15+
Fatal error: Demo::C has #[\Override] attribute, but no matching parent constant exists in %s on line %d
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
#[\Override]: Constants - no parent interface
3+
--FILE--
4+
<?php
5+
6+
interface IFace {
7+
#[\Override]
8+
public const I = 'I';
9+
}
10+
11+
echo "Done";
12+
13+
?>
14+
--EXPECTF--
15+
Fatal error: IFace::I has #[\Override] attribute, but no matching parent constant exists in %s on line %d
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
#[\Override]: Constants - on a trait, no interface or parent class
3+
--FILE--
4+
<?php
5+
6+
trait DemoTrait {
7+
#[\Override]
8+
public const T = 'T';
9+
}
10+
11+
class UsesTrait {
12+
use DemoTrait;
13+
}
14+
15+
echo "Done";
16+
17+
?>
18+
--EXPECTF--
19+
Fatal error: UsesTrait::T has #[\Override] attribute, but no matching parent constant exists in %s on line %d
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
#[\Override]: Constants - on a trait, overrides interface
3+
--FILE--
4+
<?php
5+
6+
trait DemoTrait {
7+
#[\Override]
8+
public const C = 'Changed';
9+
}
10+
11+
interface IFace {
12+
public const C = 'C';
13+
}
14+
15+
class UsesTrait implements IFace {
16+
use DemoTrait;
17+
}
18+
19+
echo "Done";
20+
21+
?>
22+
--EXPECT--
23+
Done

0 commit comments

Comments
 (0)