ΠžΡΠ½ΠΎΠ²Ρ‹ пСрСчислСний

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° классы ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ пространствами ΠΈΠΌΡ‘Π½, Ρ‡Ρ‚ΠΎ ΠΈ классы, интСрфСйсы ΠΈ Ρ‚Ρ€Π΅ΠΉΡ‚Ρ‹. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ ΠΊΠ°ΠΊ ΠΈ классы Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ автоматичСски. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ с фиксированным ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ количСством Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… допустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

<?php

enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

Π­Ρ‚ΠΎ объявлСниС создаёт Π½ΠΎΠ²Ρ‹ΠΉ пСрСчислимый Ρ‚ΠΈΠΏ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Suit, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ допустимых значСния: Suit::Hearts, Suit::Diamonds, Suit::Clubs ΠΈ Suit::Spades. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эти допустимыС значСния. Π’ функциях Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ подсказку Ρ‚ΠΈΠΏΠ°, которая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ соотвСтствиС Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ‚ΠΈΠΏΡƒ пСрСчислСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ пСрСчислСния.

<?php

enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

function
pick_a_card(Suit $suit)
{
var_dump($suit);
}

$val = Suit::Diamonds;

// OK
pick_a_card($val);

// OK
pick_a_card(Suit::Clubs);

// TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given
pick_a_card('Spades');

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ содСрТат ноль ΠΈΠ»ΠΈ большС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ case, Π±Π΅Π· ограничСния максимального количСства. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π±Π΅Π· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² синтаксичСски ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, хотя ΠΈ бСсполСзно.

Для Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² пСрСчислСния Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚Π΅ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° синтаксиса, Ρ‡Ρ‚ΠΎ ΠΈ для любой ΠΌΠ΅Ρ‚ΠΊΠΈ Π² PHP, смотритС Ρ€Π°Π·Π΄Π΅Π» Β«ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹Β».

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ скалярным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, поэтому Suit::Hearts Π½Π΅ Ρ€Π°Π²Π½ΠΎ "0". ВмСсто этого ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ поддСрТиваСтся одноэлСмСнтным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ:

<?php

enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

$a = Suit::Spades;
$b = Suit::Spades;

if (
$a === $b) {
print
"ΠœΠ°ΡΡ‚ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΏΠΎ ===\n";
}

if (
$a instanceof Suit) {
print
"ΠœΠ°ΡΡ‚ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΏΠΎ instanceof\n";
}

if (
$a !== 'Spades') {
print
"ΠœΠ°ΡΡ‚ΡŒ Π½Π΅ совпадаСт со строкой\n";
}

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ значСния пСрСчислСния Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ < ΠΈΠ»ΠΈ > Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти сравнСния Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ смысла для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². БравнСния ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ false ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ пСрСчислСния.

Π’ΠΈΠΏ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π±Π΅Π· связанных Π΄Π°Π½Π½Ρ‹Ρ… называСтся «Чистый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Β» (Π°Π½Π³Π». Pure Case). ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ чистыС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, называСтся чистым пСрСчислСниСм (Π°Π½Π³Π». Pure Enum).

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ чистый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ рСализуСтся ΠΊΠ°ΠΊ экзСмпляр своСго Ρ‚ΠΈΠΏΠ° пСрСчислСния. Π’ΠΈΠΏ пСрСчислСния Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ прСдставлСн ΠΊΠ°ΠΊ класс.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ содСрТит доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния свойство name β€” Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΊ рСгистру Π½Π°Π·Π²Π°Π½ΠΈΠ΅ самого Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°.

<?php

enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

print
Suit::Spades->name;
// Π’Ρ‹Π²ΠΎΠ΄: "Spades"

БодСрТится Π»ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π² пСрСчислСнии, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎ динамичСскому названию Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ defined(), Π° ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎ динамичСскому ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ constant(), Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π΅ рСкомСндуСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² большСй части сцСнариСв Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ пСрСчислСния.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы