PHP 8.4.2 Released!

Méthodes d'énumération

Les Enums (à la fois les Enums pures et les Enums supportées) peuvent contenir des méthodes et implémenter des interfaces. Si une Enum implémente une interface, alors toute vérification de type pour cette interface acceptera également tous les cas de cette 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"
?>

Dans cet exemple, les quatre instances de Suit ont deux méthodes, color() et shape(). En ce qui concerne le code d'appel et les vérifications de type, elles se comportent exactement comme n'importe quelle autre instance d'objet.

Dans le cas d'une Enum avec valeur de base, la déclaration de l'interface suit la déclaration du type de soutien.

<?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',
};
}
}
?>

À l'intérieur d'une méthode, la variable $this est définie et fait référence à l'instance du cas.

Les méthodes peuvent être arbitrairement complexes, mais en pratique, elles renvoient généralement une valeur statique ou match sur $this pour des résultats différents selon les cas.

Il est à noter que dans ce cas, il serait plus judicieux de définir également un type Enum SuitColor avec les valeurs Red et Black et de le renvoyer à la place. Cependant, cela compliquerait cet exemple.

La hiérarchie ci-dessus est logiquement similaire à la structure de classe suivante (bien que ce ne soit pas le code qui s'exécute) :

<?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
{
// Méthode illégale, car la définition manuelle d'une méthode cases() sur une énumération n'est pas autorisée.
// Voir aussi la section "Liste de valeurs".
}
}
?>

Les méthodes peuvent être publiques, privées ou protégées, bien qu'en pratique, privées et protégées sont équivalentes car l'héritage n'est pas autorisé.

add a note

User Contributed Notes 1 note

up
7
iloveyii at yahoo dot com
1 year ago
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();
To Top