Start · Sprachen · PHP · Referenz · uopz_undefine

uopz_undefine

Funktion

Hebt die Definition einer Konstante (oder Klassenkonstante) zur Laufzeit auf, sodass sie danach undefiniert ist.

seit PHP 5.0.0 Kategorie: misc

Signatur

uopz_undefine(string $constant): bool

Beschreibung

uopz_undefine() ist Teil der uopz-Erweiterung (User Operations for Zend Engine) und ermöglicht es, eine zuvor definierte Konstante zur Laufzeit zu entfernen. Nach dem Aufruf verhält sich die Konstante so, als ob sie nie definiert worden wäre – defined() liefert false und jeder Zugriff auf ihren Namen als Konstante schlägt fehl.

Die Funktion existiert in zwei Varianten: Mit einem Argument wird eine globale Konstante aufgehoben. Mit zwei Argumenten ($class und $constant) wird eine Klassenkonstante entfernt. Dies ist besonders nützlich beim Unit-Testing, wenn bestimmte Konstanten den Programmfluss beeinflussen und für einzelne Tests in einen undefinierten Zustand versetzt werden sollen.

Wichtig: uopz_undefine() ist ausschließlich für Test- und Debugging-Umgebungen gedacht. Im Produktiveinsatz kann das Entfernen von Konstanten zu schwerem undefiniertem Verhalten führen, da viele Code-Teile auf deren Existenz angewiesen sein können.

Die Funktion ergänzt uopz_redefine(), mit der eine Konstante auf einen neuen Wert gesetzt werden kann, ohne sie zunächst aufheben zu müssen.

Parameter

Name Typ Default Beschreibung
$class string Optionaler Klassenname, wenn eine Klassenkonstante aufgehoben werden soll. Wird dieser Parameter angegeben, muss constant der Name der aufzuhebenden Klassenkonstante sein.
$constant Pflicht string Der Name der aufzuhebenden Konstante. Bei globalem Aufruf (ohne class) handelt es sich um eine globale Konstante, andernfalls um eine Klassenkonstante der angegebenen Klasse.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Konstante erfolgreich aufgehoben wurde. Gibt false zurück, wenn die Konstante nicht existiert oder das Aufheben fehlschlägt.

Beispiele

Globale Konstante zur Laufzeit aufheben

<?php
define('APP_DEBUG', true);

var_dump(defined('APP_DEBUG')); // true
var_dump(APP_DEBUG);            // true

uopz_undefine('APP_DEBUG');

var_dump(defined('APP_DEBUG')); // false
// var_dump(APP_DEBUG); // würde Notice/Warning erzeugen – Konstante undefiniert
bool(true) bool(true) bool(false)

Klassenkonstante im Unit-Test aufheben

<?php
class Config {
    const VERSION = '1.0.0';
}

var_dump(defined('Config::VERSION')); // true
var_dump(Config::VERSION);            // '1.0.0'

uopz_undefine('Config', 'VERSION');

var_dump(defined('Config::VERSION')); // false
// Zugriff auf Config::VERSION wäre nun ein fataler Fehler
bool(true) string(5) "1.0.0" bool(false)

// Wichtig · Fallstricke

Nur für Test-/Debugging-Umgebungen: uopz_undefine() sollte niemals in Produktionscode eingesetzt werden. Das Entfernen von Konstanten zur Laufzeit kann zu schwerwiegenden, schwer nachvollziehbaren Fehlern führen.

Die Funktion setzt die uopz-PHP-Erweiterung voraus, die standardmäßig nicht installiert ist und separat über PECL bezogen werden muss (pecl install uopz). Die API hat sich zwischen verschiedenen uopz-Versionen leicht geändert – insbesondere das Zwei-Argument-Verhalten für Klassenkonstanten. Stellen Sie sicher, dass Sie eine zur installierten Version passende Doku verwenden.

In manchen Versionen der uopz-Erweiterung wirkt uopz_undefine() nur für den aktuellen Request und wird nicht persistent gespeichert. Bei der Verwendung in Test-Frameworks wie PHPUnit empfiehlt es sich, aufgehobene Konstanten in der tearDown()-Methode mit uopz_redefine() wiederherzustellen.