ЗоштоENUM не може да се прошират
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
ЗоштоENUM не може да се прошират
Референца за `language.enumerations.object-differences.inheritance.php` со подобрена типографија и навигација.
ЗоштоENUM не може да се прошират
Класите имаат договори на своите методи:
<?php
class A {}
class B extends A {}
function foo(A $a) {}
function bar(B $b) {
foo($b);
}
?>Овој код е тип-безбеден, бидејќи Б го следи договорот на А, и преку магијата на ко/контра-варијанса, секое очекување што може да го имате од методите ќе биде зачувано, освен исклучоците.
Енумите имаат договори на своите случаи, не методи:
<?php
enum ErrorCode {
case SOMETHING_BROKE;
}
function quux(ErrorCode $errorCode)
{
// When written, this code appears to cover all cases
match ($errorCode) {
ErrorCode::SOMETHING_BROKE => true,
};
}
?>
На match изјава во функцијата quux може статички да се анализира за да ги покрие сите случаи во ErrorCode.
Но, замислете дека беше дозволено да се прошират енумите:
<?php
// Thought experiment code where enums are not final.
// Note, this won't actually work in PHP.
enum MoreErrorCode extends ErrorCode {
case PEBKAC;
}
function fot(MoreErrorCode $errorCode) {
quux($errorCode);
}
fot(MoreErrorCode::PEBKAC);
?>Според нормалните правила за наследување, класа што проширува друга ќе ја помине проверката на типот.
Проблемот би бил тоа што match изјава во quux() веќе не ги покрива сите случаи. Бидејќи не знае за MoreErrorCode::PEBKAC проверката ќе фрли исклучок.
Поради ова, енумите се конечни и не можат да се прошират.