Diferenças de objetos
Apesar de Enums serem construídas sobre classes e objetos, elas não suportam todas as funcionalidades relacionadas a objetos. Em particular, casos Enum são proibidos de ter estado.
- Construtores e Destrutores são proibidos.
- Herança não é suportada. Enums não podem estender ou ser estendidos.
- Propriedades estáticas ou de objeto não são permitidas.
- Clonar um caso Enum não é suportado, pois os casos devem ser instâncias singleton.
- Métodos mágicos, exceto para aqueles listados abaixo, não são permitidos.
- Enums sempre precisam ser declarados antes de serem utilizados.
As seguintes funcionalidades de objeto estão disponíveis, e se comportam exatamente como em qualquer outro objeto:
- Métodos públicos, privados e protegidos.
- Métodos estáticos públicos, privados e protegidos.
- Constantes públicas, privadas e protegidas.
- Enums podem implementar qualquer número de interfaces.
-
Enums e casos podem ter atributos anexados
a eles. O filtro de alvo
TARGET_CLASS
inclui as próprias Enums. O filtro de alvoTARGET_CLASS_CONST
inclui Casos Enum. - Os métodos mágicos __call, __callStatic, e __invoke
- Constantes
__CLASS__
e__FUNCTION__
se comportam normalmente
A constante mágica ::class
em um tipo Enum avalia ao nome
do tipo incluindo qualquer namespace, exatamente o mesmo que um objeto. A constante mágica ::class
em uma instância de Caso também avalia para o tipo Enum, pois ele é uma
instância daquele tipo.
Adicionalmente, casos não podem ser instanciados diretamente com new
, nem com
ReflectionClass::newInstanceWithoutConstructor() em reflexão. Ambos resultarão em um erro.
<?php
$trevos = new Naipe();
// Error: Cannot instantiate enum Naipe
$ferraduras = (new ReflectionClass(Naipe::class))->newInstanceWithoutConstructor()
// Error: Cannot instantiate enum Naipe
?>