PHP 8.4.6 Released!

Porque enums não são extensíveis

Classes possuem contratos em seus métodos:

<?php

class A {}
class
B extends A {}

function
foo(A $a) {}

function
bar(B $b) {
foo($b);
}
?>

Esse código é correto para tipos, pois B segue o contrato de A, e através da co e contra variância, quaisquer expectativas a respeito dos métodos será atendida.

Enums possuem contratos em seus itens, não em seus métodos:

<?php

enum ErrorCode {
case
SOMETHING_BROKE;
}

function
quux(ErrorCode $errorCode)
{
/ Nesse primeiro momento, esse código prevê todos os casos
match ($errorCode) {
ErrorCode::SOMETHING_BROKE => true,
};
}

?>

A instrução match na função quux pode ser analisada estaticamente para verificar se cobre todos os casos possíveis em ErrorCode.

Mas imagine que seja possível estender enums, assim:

<?php

/ Apenas para o exemplo onde enums não são finais.
/ Isto *não* funciona no PHP.
enum MoreErrorCode extends ErrorCode {
case
PEBKAC;
}

function
fot(MoreErrorCode $errorCode) {
quux($errorCode);
}

fot(MoreErrorCode::PEBKAC);

?>

Em condições normais de herança, uma classe que estende outro passará na checagem de tipos.

O problema ocorreria na instrução match da função quux() que agora não cobre todos os casos. Porque a função não prevê o item MoreErrorCode::PEBKAC o match irá falhar com uma exceção.

Por conta disso, enums são finais e não podem ser estendidos.

adicione uma nota

Notas Enviadas por Usuários (em inglês)

Não há notas de usuários para esta página.
To Top

Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant