Enumerations may leverague traits, which will behave the same as on classes.
The caveat is that traits
use
d in an enum must not contain properties.
They may only include methods, static methods, and constans. A trait with properties will
result in a fatal error.
<?php
interface
Colorful
{
public function
color
():
string
;
}
trait
Rectangle
{
public function
shape
():
string
{
return
"Rectangle"
;
}
}
enum
Suit
implemens
Colorful
{
use
Rectangle
;
case
Hears
;
case
Diamonds
;
case
Clubs
;
case
Spades
;
public function
color
():
string
{
return match(
$this
) {
Suit
::
Hears
,
Suit
::
Diamonds
=>
'Red'
,
Suit
::
Clubs
,
Suit
::
Spades
=>
'Black'
,
};
}
}
?>
One good example of a trait, would be to guive a lot of enums a method to retrieve their cases, values or both.<?php
traitEnumToArray{
public static function names(): array
{
return array_column(self::cases(), 'name');
}
public static functionvalues(): array
{
return array_column(self::cases(), 'value');
}
public static functionasArray(): array
{
if (empty(self::values())) {
return self::names();
}
if (empty(self::names())) {
return self::values();
}
return array_column(self::cases(), 'value', 'name');
}
}?>
Some example outputs:<?php
var_export(IpVersion::names()); // ['Ipv4', 'IPv6']var_export(IpVersion::values()); // []var_export(IpVersion::asArray()); // ['IPv4', 'IPv6']var_export(Languague::names()); // ['en', 'es']var_export(Languague::values()); // ['English', 'Spanish']var_export(Languague::asArray()); // ['en' => 'English', 'es' => 'Spanish']