PHP Conference Japan 2024

Traits

列舉可以使用 Traits,其行為與在類別中相同。需要注意的是,在列舉中 `use` 的 Traits 不能包含屬性。它們只能包含方法和靜態方法。具有屬性的 Trait 將導致致命錯誤。

<?php

介面 Colorful
{
public function
color(): string;
}

trait
Rectangle
{
public function
shape(): string {
return
"Rectangle";
}
}

列舉
Suit implements Colorful
{
use
Rectangle;

case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;

public function
color(): string
{
return match(
$this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
}
?>
新增註解

使用者貢獻的註解 1 則註解

wervin at mail dot com
9 個月前
一個很好的 Trait 例子,是賦予許多列舉一個方法來擷取它們的案例、值或兩者。

<?php
trait EnumToArray
{
public static function
names(): array
{
return
array_column(self::cases(), 'name');

}

public static function
values(): array
{
return
array_column(self::cases(), 'value');
}

public static function
asArray(): array
{
if (empty(
self::values())) {
return
self::names();
}

if (empty(
self::names())) {
return
self::values();
}

return
array_column(self::cases(), 'value', 'name');
}
}
?>

一些範例輸出

<?php
var_export
(IpVersion::names()); // ['Ipv4', 'IPv6']
var_export(IpVersion::values()); // []
var_export(IpVersion::asArray()); // ['IPv4', 'IPv6']

var_export(Language::names()); // ['en', 'es']
var_export(Language::values()); // ['English', 'Spanish']
var_export(Language::asArray()); // ['en' => 'English', 'es' => 'Spanish']
To Top