Skip to content

Commit 1d49825

Browse files
committed
Implement enums
RFC: https://wiki.php.net/rfc/enumerations Co-authored-by: Larry Garfield <larry@garfieldtech.com> Closes GH-6489.
1 parent 89d4b6b commit 1d49825

File tree

93 files changed

+2342
-27
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+2342
-27
lines changed

Zend/tests/enum/__call.phpt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--TEST--
2+
Enum __call
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
9+
public function __call(string $name, array $args)
10+
{
11+
return [$name, $args];
12+
}
13+
}
14+
15+
var_dump(Foo::Bar->baz('qux', 'quux'));
16+
17+
?>
18+
--EXPECT--
19+
array(2) {
20+
[0]=>
21+
string(3) "baz"
22+
[1]=>
23+
array(2) {
24+
[0]=>
25+
string(3) "qux"
26+
[1]=>
27+
string(4) "quux"
28+
}
29+
}

Zend/tests/enum/__class__.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Enum __CLASS__
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
9+
public function printClass()
10+
{
11+
echo __CLASS__ . "\n";
12+
}
13+
}
14+
15+
Foo::Bar->printClass();
16+
17+
?>
18+
--EXPECT--
19+
Foo

Zend/tests/enum/__function__.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Enum __FUNCTION__
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
9+
public function printFunction()
10+
{
11+
echo __FUNCTION__ . "\n";
12+
}
13+
}
14+
15+
Foo::Bar->printFunction();
16+
17+
?>
18+
--EXPECT--
19+
printFunction

Zend/tests/enum/__get.phpt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Enum __get
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
9+
public function __get(string $name): string
10+
{
11+
return '__get ' . $name . "\n";
12+
}
13+
}
14+
15+
echo Foo::Bar->baz;
16+
echo Foo::Bar->qux;
17+
18+
?>
19+
--EXPECT--
20+
__get baz
21+
__get qux

Zend/tests/enum/__invoke.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Enum __invoke
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
9+
public function __invoke(...$args)
10+
{
11+
return $args;
12+
}
13+
}
14+
15+
var_dump((Foo::Bar)('baz', 'qux'));
16+
17+
?>
18+
--EXPECT--
19+
array(2) {
20+
[0]=>
21+
string(3) "baz"
22+
[1]=>
23+
string(3) "qux"
24+
}

Zend/tests/enum/basic-methods.phpt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Enum methods
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
case Baz;
9+
10+
public function dump() {
11+
var_dump($this);
12+
}
13+
}
14+
15+
Foo::Bar->dump();
16+
Foo::Baz->dump();
17+
18+
?>
19+
--EXPECT--
20+
enum(Foo::Bar)
21+
enum(Foo::Baz)

Zend/tests/enum/case-attributes.phpt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
Enum case attributes
3+
--FILE--
4+
<?php
5+
6+
#[Attribute]
7+
class EnumCaseAttribute {
8+
public function __construct(
9+
public string $value,
10+
) {}
11+
}
12+
13+
enum Foo {
14+
#[EnumCaseAttribute('Bar')]
15+
case Bar;
16+
}
17+
18+
var_dump((new \ReflectionClassConstant(Foo::class, 'Bar'))->getAttributes(EnumCaseAttribute::class)[0]->newInstance());
19+
20+
?>
21+
--EXPECT--
22+
object(EnumCaseAttribute)#1 (1) {
23+
["value"]=>
24+
string(3) "Bar"
25+
}

Zend/tests/enum/comparison.phpt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--TEST--
2+
Enum comparison
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
case Baz;
9+
}
10+
11+
$bar = Foo::Bar;
12+
$baz = Foo::Baz;
13+
14+
var_dump($bar === $bar);
15+
var_dump($bar == $bar);
16+
17+
var_dump($bar === $baz);
18+
var_dump($bar == $baz);
19+
20+
var_dump($baz === $bar);
21+
var_dump($baz == $bar);
22+
23+
?>
24+
--EXPECT--
25+
bool(true)
26+
bool(true)
27+
bool(false)
28+
bool(false)
29+
bool(false)
30+
bool(false)

Zend/tests/enum/constant-aliases.phpt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Enum constants can alias cases
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
const Baz = self::Bar;
9+
}
10+
11+
function test(Foo $var) {
12+
echo "works\n";
13+
}
14+
15+
test(Foo::Bar);
16+
test(Foo::Baz);
17+
18+
?>
19+
--EXPECT--
20+
works
21+
works

Zend/tests/enum/constants.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Enum allows constants
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
const BAR = 'Bar';
8+
}
9+
10+
echo Foo::BAR . "\n";
11+
12+
?>
13+
--EXPECT--
14+
Bar
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Enum in default parameter
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
}
9+
10+
function baz(Foo $foo = Foo::Bar) {
11+
var_dump($foo);
12+
}
13+
14+
baz();
15+
16+
?>
17+
--EXPECT--
18+
enum(Foo::Bar)

Zend/tests/enum/enum-as-constant.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Enum cases can be referenced by constants
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
}
9+
10+
const Beep = Foo::Bar;
11+
12+
class Test {
13+
const Beep = Foo::Bar;
14+
}
15+
16+
var_dump(Beep);
17+
var_dump(Test::Beep);
18+
19+
?>
20+
--EXPECT--
21+
enum(Foo::Bar)
22+
enum(Foo::Bar)

Zend/tests/enum/enum-as-params.phpt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Enum types as parameters
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
}
9+
10+
enum Baz {
11+
case Qux;
12+
}
13+
14+
function takesFoo(Foo $foo) {}
15+
function takesBaz(Baz $baz) {}
16+
17+
takesFoo(Foo::Bar);
18+
takesBaz(Baz::Qux);
19+
20+
try {
21+
takesBaz(Foo::Bar);
22+
} catch (Error $e) {
23+
echo $e->getMessage() . "\n";
24+
}
25+
26+
try {
27+
takesFoo(Baz::Qux);
28+
} catch (Error $e) {
29+
echo $e->getMessage() . "\n";
30+
}
31+
32+
?>
33+
--EXPECTF--
34+
takesBaz(): Argument #1 ($baz) must be of type Baz, Foo given, called in %s on line %d
35+
takesFoo(): Argument #1 ($foo) must be of type Foo, Baz given, called in %s on line %d

Zend/tests/enum/enum-attributes.phpt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
Enum attributes
3+
--FILE--
4+
<?php
5+
6+
#[Attribute]
7+
class EnumAttribute {
8+
public function __construct(
9+
public string $value,
10+
) {}
11+
}
12+
13+
#[EnumAttribute('Foo')]
14+
enum Foo {}
15+
16+
var_dump((new \ReflectionClass(Foo::class))->getAttributes(EnumAttribute::class)[0]->newInstance());
17+
18+
?>
19+
--EXPECT--
20+
object(EnumAttribute)#1 (1) {
21+
["value"]=>
22+
string(3) "Foo"
23+
}

Zend/tests/enum/enum-in-constant.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Enum in constant
3+
--FILE--
4+
<?php
5+
6+
enum Foo {
7+
case Bar;
8+
}
9+
10+
class Baz {
11+
const BAR = Foo::Bar;
12+
}
13+
14+
var_dump(Foo::Bar);
15+
var_dump(Baz::BAR);
16+
var_dump(Foo::Bar === Baz::BAR);
17+
18+
?>
19+
--EXPECT--
20+
enum(Foo::Bar)
21+
enum(Foo::Bar)
22+
bool(true)

Zend/tests/enum/final.phpt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
Enum is final
3+
--FILE--
4+
<?php
5+
6+
enum Foo {}
7+
8+
class Bar extends Foo {}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Class Bar may not inherit from final class (Foo) in %s on line %d

0 commit comments

Comments
 (0)