@@ -918,6 +918,31 @@ readonly class ReadOnlyCls {
918918
919919class FinalCost { final public const FOO = ' foo' ; }
920920
921+ // PHP 8.3 typed class constants
922+ enum E {
923+ const string TEST = "Test1"; // E::TEST is a string
924+ }
925+
926+ trait T {
927+ const string TEST = E::TEST ; // T::TEST is a string too
928+ }
929+
930+ interface I {
931+ const string TEST = E ::TEST ; // I::TEST is a string as well
932+ }
933+
934+ class Foo implements I {
935+ use T ;
936+
937+ const string TEST = E ::TEST ; // Foo::TEST must also be a string
938+ }
939+
940+ class Bar extends Foo {
941+ const string TEST = " Test2" ; // Bar::TEST must also be a string, but the value can change
942+ public const int | null I = null ;
943+ public const ? int J = null ;
944+ }
945+
921946==================================== = output ==================================== =
922947< ? php
923948
@@ -1368,5 +1393,35 @@ class FinalCost
13681393 final public const FOO = " foo" ;
13691394}
13701395
1396+ // PHP 8.3 typed class constants
1397+ enum E
1398+ {
1399+ const string TEST = "Test1"; // E::TEST is a string
1400+ }
1401+
1402+ trait T
1403+ {
1404+ const string TEST = E::TEST ; // T::TEST is a string too
1405+ }
1406+
1407+ interface I
1408+ {
1409+ const string TEST = E ::TEST ; // I::TEST is a string as well
1410+ }
1411+
1412+ class Foo implements I
1413+ {
1414+ use T ;
1415+
1416+ const string TEST = E ::TEST ; // Foo::TEST must also be a string
1417+ }
1418+
1419+ class Bar extends Foo
1420+ {
1421+ const string TEST = " Test2" ; // Bar::TEST must also be a string, but the value can change
1422+ public const int | null I = null ;
1423+ public const ? int J = null ;
1424+ }
1425+
13711426================================================================================
13721427` ;
0 commit comments