Uppräkningsvärden i konstantuttryck

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Enum-värden i konstanter

Eftersom cases representeras som konstanter i själva enumen, kan de användas som statiska värden i de flesta konstanta uttryck: egenskapsstandardvärden, statiska variabelstandardvärden, parametrarstandardvärden, globala och klasskonstantvärden. De kan inte användas i andra enum-case-värden, men vanliga konstanter kan referera till ett enum-case.

Däremot är implicita magiska metodanrop som `ArrayAccess` på enums inte tillåtna i statiska eller konstanta definitioner eftersom vi inte kan garantera att det resulterande värdet är deterministiskt eller att metodanropet är fritt från sidoeffekter. Funktionsanrop, metodanrop och egenskapsåtkomst fortsätter att vara ogiltiga operationer i konstanta uttryck.

<?php

// Detta är en helt laglig Enum-definition.
enum Direction implements ArrayAccess
{
    case Up;
    case Down;

    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
{
    // Detta är tillåtet.
    const DOWN = Direction::Down;

    // Detta är inte tillåtet, eftersom det kanske inte är deterministiskt.
    const UP = Direction::Up['short'];
    // Fatalt fel: Kan inte använda [] på enums i konstanta uttryck
}

// Detta är helt lagligt eftersom det inte är ett konstant uttryck.
$x = Direction::Up['short'];
var_dump("\$x är " . var_export($x, true));

$foo = new Foo();
?>

Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.enumerations.expressions.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/