Varför uppräkningar inte är utbyggbara: Skillnad mellan sidversioner
Admin (diskussion | bidrag) (Skapade sidan med '== Varför enums inte kan utökas == Klasser har kontrakt på sina metoder: <pre> class A {} class B extends A {} function foo(A $a) {} function bar(B $b) { foo($b); } </pre> Denna kod är typ-säker, eftersom B följer kontraktet för A, och genom co/contra-variansens magi kommer alla förväntningar man kan ha på metoderna att bevaras, med undantag för undantag. Enums har kontrakt på sina cases, inte metoder: <pre> enum ErrorCode { case SOMETHING_BROK...') |
Admin (diskussion | bidrag) |
||
(En mellanliggande sidversion av samma användare visas inte) | |||
Rad 1: | Rad 1: | ||
Klasser har kontrakt på sina metoder: | Klasser har kontrakt på sina metoder: | ||
Rad 57: | Rad 57: | ||
= Sidslut = | = Sidslut = | ||
Orginalhemsidan på Engelska : | Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.enumerations.object-differences.inheritance.php | ||
<BR>[[PHP]] | <BR>[[PHP]] | ||
<BR>[[Språkreferens]] | <BR>[[Språkreferens]] |
Nuvarande version från 13 oktober 2024 kl. 13.03
Klasser har kontrakt på sina metoder:
class A {} class B extends A {} function foo(A $a) {} function bar(B $b) { foo($b); }
Denna kod är typ-säker, eftersom B följer kontraktet för A, och genom co/contra-variansens magi kommer alla förväntningar man kan ha på metoderna att bevaras, med undantag för undantag.
Enums har kontrakt på sina cases, inte metoder:
enum ErrorCode { case SOMETHING_BROKE; } function quux(ErrorCode $errorCode) { // När det skrivs, verkar denna kod täcka alla fall match ($errorCode) { ErrorCode::SOMETHING_BROKE => true, } }
Match-satsen i funktionen quux kan statiskt analyseras för att täcka alla fall i ErrorCode.
Men tänk om det var tillåtet att utöka enums:
/* Tankeexperiment där enums inte är slutgiltiga. Observera, detta kommer faktiskt inte att fungera i PHP. */ enum MoreErrorCode extends ErrorCode { case PEBKAC; } function fot(MoreErrorCode $errorCode) { quux($errorCode); } fot(MoreErrorCode::PEBKAC);
Under normala arvregler skulle en klass som utökar en annan klara typkontrollen.
Problemet skulle vara att match-satsen i quux() inte längre täcker alla fall. Eftersom den inte känner till MoreErrorCode::PEBKAC kommer match-satsen att kasta ett undantag.
På grund av detta är enums slutgiltiga och kan inte utökas.
Sidslut
Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.enumerations.object-differences.inheritance.php
PHP
Språkreferens
Språkreferens#Uppräkningar
Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/