PHP Velho Oeste 2024

Valores enum em expressões constantes

Como os casos são representados como constantes no próprio enum, eles podem ser usados como valores estáticos na maioria das expressões constantes: padrões de propriedades, padrões de variáveis estáticas, padrões de parâmetros, valores constantes globais e de classes. Eles não podem ser usados em outros valores de caso enum, mas constantes normais podem se referir a um caso enum.

No entanto, chamadas implícitas de métodos mágicos como ArrayAccess em enums não são permitidas em definições estáticas ou de constantes já que não podemos garantir absolutamente que o valor resultante é determinístico ou que a invocação do método é livre de efeitos colaterais. Chamadas de funções, chamadas de métodos e acesso às propriedades continuam a ser operações inválidas em expressões constantes.

<?php

// Esta é uma definição de Enum perfeitamente legal.
enum Direcao implements ArrayAccess
{
case
Cima;
case
Baixo;

public function
offsetExists($offset): bool
{
return
false;
}

public function
offsetGet($offset): mixed
{
return
null;
}

public function
offsetSet($offset, $value): void
{
throw new
Exception();
}

public function
offsetUnset($offset): void
{
throw new
Exception();
}
}

class
Foo
{
// Isto é permitido.
const BAIXO = Direcao::Baixo;

// Isto não é permitido, pois pode não ser determinístico.
const CIMA = Direcao::Cima['curta'];
// Fatal error: Cannot use [] on enums in constant expression
}

// Isto é perfeitamente legal, porque não é uma expressão constante.
$x = Direcao::Cima['curta'];
var_dump("\$x is " . var_export($x, true));

$foo = new Foo();
?>
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top