Just to complete the function shape in the above neat example:
<?php
interface Colorful
{
public function color(): string;
}
enum Suit implements Colorful
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
// Fulfills the interface contract.
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
// Not part of an interface; that's fine.
public function shape(): string
{
return match($this) {
Suit::Hearts => '❤️',
Suit::Diamonds => '💎',
Suit::Clubs => '♣️',
Suit::Spades => ' ♠️'
};
}
}
echo Suit::Diamonds->shape();
echo PHP_EOL;
echo Suit::Clubs->shape();МЕТОДИ НАENUMЕРАЦИЈА
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
МЕТОДИ НАENUMЕРАЦИЈА
Референца за `language.enumerations.methods.php` со подобрена типографија и навигација.
МЕТОДИ НАENUMЕРАЦИЈА
Енумерациите (како Чисти Енумерации така и Поткрепени Енумерации) може да содржат методи и може да имплементираат интерфејси. Ако Енумерација имплементира интерфејс, тогаш секоја проверка на типот за тој интерфејс ќе ги прифати и сите случаи на таа Енумерација.
<?php
interface Colorful
{
public function color(): string;
}
enum Suit implements Colorful
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
// Fulfills the interface contract.
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
// Not part of an interface; that's fine.
public function shape(): string
{
return "Rectangle";
}
}
function paint(Colorful $c)
{
/* ... */
}
paint(Suit::Clubs); // Works
print Suit::Diamonds->shape(); // prints "Rectangle"
?>
Енумите (и Чисти Енуми и Поткрепени Енуми) можат да содржат методи и можат да имплементираат интерфејси. Ако Енум имплементира интерфејс, тогаш секоја проверка на типот за тој интерфејс ќе ги прифати сите случаи на тој Енум. Suit Во овој пример, сите четири инстанци на
color() and shape()имаат два методи,
. Што се однесува до повикувачкиот код и проверките на типот, тие се однесуваат исто како и сите други инстанци на објекти.
<?php
interface Colorful
{
public function color(): string;
}
enum Suit: string implements Colorful
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
// Fulfills the interface contract.
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
}
?>
На Поткрепен Енум, декларацијата на интерфејсот оди по декларацијата на типот за поткрепа. $this Внатре во метод, променливата
е дефинирана и се однесува на инстанцата на Случајот.
match on $this Методите можат да бидат произволно сложени, но во пракса обично ќе враќаат статична вредност или
за да обезбедат различни резултати за различни случаи.
SuitColor Забележете дека во овој случај би било подобра практика за моделирање на податоци да се дефинира и
Енум Тип со вредности Црвено и Црно и да се врати тоа наместо тоа. Сепак, тоа би го искомплицирало овој пример.
<?php
interface Colorful
{
public function color(): string;
}
final class Suit implements UnitEnum, Colorful
{
public const Hearts = new self('Hearts');
public const Diamonds = new self('Diamonds');
public const Clubs = new self('Clubs');
public const Spades = new self('Spades');
private function __construct(public readonly string $name) {}
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
public function shape(): string
{
return "Rectangle";
}
public static function cases(): array
{
// Illegal method, because manually defining a cases() method on an Enum is disallowed.
// See also "Value listing" section.
}
}
?>Горната хиерархија е логички слична на следната структура на класи (иако ова не е вистинскиот код што се извршува):