- 添加了枚举类型的语法解析功能 - 实现了对带值枚举(backed enums)的支持 - 添加了枚举案例值的存储和访问机制 - 支持枚举类型的运行时对象处理 - 完善了枚举常量数组的生成逻辑 - 新增了多个枚举相关的测试用例pull/1/head
parent
6849c56cc2
commit
26bdf5eb59
6 changed files with 130 additions and 0 deletions
@ -0,0 +1,41 @@ |
|||||||
|
--TEST-- |
||||||
|
enum 2 |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
enum T: string |
||||||
|
{ |
||||||
|
case I = 'int'; |
||||||
|
case S = 'string'; |
||||||
|
} |
||||||
|
|
||||||
|
final class TestSpa |
||||||
|
{ |
||||||
|
private const F = [ |
||||||
|
'1' => ['d' => '', 't' => T::S], |
||||||
|
'2' => ['d' => 1, 't' => T::I], |
||||||
|
'3' => ['d' => 123, 't' => T::S], |
||||||
|
]; |
||||||
|
|
||||||
|
public static function E(): array |
||||||
|
{ |
||||||
|
return self::F; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function main() |
||||||
|
{ |
||||||
|
foreach (TestSpa::E() as $n => $f) { |
||||||
|
|
||||||
|
$ok = match ($f['t']) { |
||||||
|
T::I => is_int($f['d']), |
||||||
|
T::S => is_string($f['d']), |
||||||
|
}; |
||||||
|
|
||||||
|
echo $ok? " pass {$n} => [{$f['d']}, {$f['t']->value}]\n": " fail {$n} 元组非法\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
pass 1 => [, string] |
||||||
|
pass 2 => [1, int] |
||||||
|
fail 3 元组非法 |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
--TEST-- |
||||||
|
enum 2 |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
enum TestEnum |
||||||
|
{ |
||||||
|
case FOO; |
||||||
|
case BAR; |
||||||
|
} |
||||||
|
|
||||||
|
final class TestSpa |
||||||
|
{ |
||||||
|
public const F = [ |
||||||
|
TestEnum::FOO, |
||||||
|
TestEnum::BAR, |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
function main() |
||||||
|
{ |
||||||
|
var_dump(TestSpa::F); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
array(2) { |
||||||
|
[0]=> |
||||||
|
enum(TestEnum::FOO) |
||||||
|
[1]=> |
||||||
|
enum(TestEnum::BAR) |
||||||
|
} |
||||||
@ -0,0 +1,31 @@ |
|||||||
|
--TEST-- |
||||||
|
enum 2 |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
enum TestEnum: string |
||||||
|
{ |
||||||
|
case FOO = TestSpa::F; |
||||||
|
case BAR = 'bar'; |
||||||
|
} |
||||||
|
|
||||||
|
final class TestSpa |
||||||
|
{ |
||||||
|
public const F = 'foo'; |
||||||
|
} |
||||||
|
|
||||||
|
function main() |
||||||
|
{ |
||||||
|
var_dump(TestEnum::cases()); |
||||||
|
var_dump(TestEnum::FOO); |
||||||
|
var_dump((string) TestEnum::FOO->value); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
array(2) { |
||||||
|
[0]=> |
||||||
|
enum(TestEnum::FOO) |
||||||
|
[1]=> |
||||||
|
enum(TestEnum::BAR) |
||||||
|
} |
||||||
|
enum(TestEnum::FOO) |
||||||
|
string(3) "foo" |
||||||
Loading…
Reference in new issue