Statement on glibc/iconv Vulnerability

Enum-Werte in konstanten Ausdrücken

Da die Fälle in der Enum selbst als Konstanten dargestellt werden, können sie in den meisten konstanten Ausdrücken als statische Werte verwendet werden: als Standardwerte für Eigenschaften, statische Variablen und Parameter und als globale Werte und Klassenkonstanten. Sie dürfen nicht in den Werten anderer Enum-Fälle verwendet werden, aber normale Konstanten können sich auf einen Enum-Fall beziehen.

Dagegen sind implizite Aufrufe magischer Methoden wie ArrayAccess in Enums in statischen oder konstanten Definitionen nicht erlaubt, da nicht absolut garantiert werden kann, dass der resultierende Wert deterministisch ist oder dass der Methodenaufruf frei von Seiteneffekten ist. Funktionsaufrufe, Methodenaufrufe und der Zugriff auf Eigenschaften sind in konstanten Ausdrücken weiterhin nicht erlaubt.

<?php

// Dies ist eine völlig zulässige Definition einer Enum.
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
{
// Dies ist erlaubt.
const DOWN = Direction::Down;

// Dies ist unzulässig, da es nicht deterministisch sein kann.
const UP = Direction::Up['short'];
// Fatal error: Cannot use [] on enums in constant expression
}

// Dies ist völlig zulässig, da es kein konstanter Ausdruck ist.
$x = Direction::Up['short'];
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