defined()
Die Funktion defined() in PHP prüft, ob eine Konstante definiert ist oder nicht.
Was die Funktion defined() bewirkt
defined() ist eine eingebaute PHP-Funktion, die prüft, ob eine Konstante mit einem bestimmten Namen bereits existiert. Sie gibt true zurück, wenn die Konstante definiert ist, und false, wenn nicht. Diese Seite behandelt die Syntax, das Testen von Klassen- und Namespace-Konstanten, den häufigen Fehler der Verwechslung mit isset() und wann man diese Funktion tatsächlich einsetzen würde.
Eine Konstante ist ein Name, dessen Wert sich während einer einzelnen Anfrage nicht ändern kann — erstellt mit define() oder dem Schlüsselwort const. Da das Referenzieren einer undefinierten Konstante einen Fehler auslöst (eine Error-Ausnahme in PHP 8+, einen Hinweis in älteren Versionen), ermöglicht defined() eine vorherige Prüfung und verhindert dies.
Syntax
defined(string $constant_name): bool$constant_name— ein string, der den Namen der zu suchenden Konstante enthält. Beachten Sie, dass Sie den Namen als string übergeben ("GREETING"), nicht die Konstante selbst (GREETING).- Gibt
truezurück, wenn eine Konstante mit diesem Namen existiert, andernfallsfalse.
Die bloße Konstante anstelle ihres Namens zu übergeben —
defined(GREETING)— versucht zunächst,GREETINGauszuwerten, was fehlschlägt, wenn sie nicht definiert ist. Setzen Sie den Namen stets in Anführungszeichen.
Einfaches Beispiel
Da GREETING in der Zeile darüber erstellt wurde, gibt defined("GREETING") true zurück und das Skript gibt Hello, world! aus.
Klassen- und Namespace-Konstanten prüfen
defined() funktioniert auch mit Klassen- und Namespace-Konstanten. Verwenden Sie den vollständig qualifizierten Namen als string:
<?php
const PI = 3.14;
class Circle {
const SHAPE = "round";
}
var_dump(defined("PI")); // bool(true)
var_dump(defined("Circle::SHAPE")); // bool(true) — class constant
var_dump(defined("Circle::MISSING"));// bool(false) — no such constant
var_dump(defined("UNDEFINED")); // bool(false)Bei Klassenkonstanten lautet die Syntax "ClassName::CONSTANT_NAME". Für eine Namespace-Konstante geben Sie den vollständigen Pfad an, z. B. defined("App\\Config\\VERSION").
defined() vs. isset(): ein häufiger Irrtum
defined() prüft Konstanten; isset() prüft Variablen (und Array-Schlüssel / Objekteigenschaften). Sie sind nicht austauschbar:
<?php
$name = "Alex"; // a variable
define("APP_NAME", "W3"); // a constant
var_dump(isset($name)); // bool(true) — variable exists
var_dump(defined("name")); // bool(false) — no constant called "name"
var_dump(defined("APP_NAME")); // bool(true) — constant existsWenn Sie sich dabei ertappen, nach defined("$variable") zu greifen, möchten Sie mit hoher Wahrscheinlichkeit stattdessen isset() verwenden.
Wann man es verwenden sollte
- Optionale Konfigurations-Konstanten absichern. Frameworks erlauben es oft, Konstanten wie
DEBUGoderAPP_ENVvorzudefinieren; verwenden Siedefined(), um einen Standardwert nur dann anzuwenden, wenn der Benutzer noch keinen gesetzt hat. - Doppelte Definitionen verhindern.
define()gibt beim Neudefinieren einer vorhandenen Konstante eine Warnung aus; umschließen Sie es daher:if (!defined("API_KEY")) { define("API_KEY", "..."); }. - Feature-Erkennung. Bibliotheken stellen Markierungskonstanten bereit (z. B.
PHP_VERSION_ID);defined()bestätigt, dass ein auf Konstanten basierendes Feature verfügbar ist, bevor man sich darauf verlässt.
Um den Wert einer Konstante auszulesen, sobald Sie wissen, dass sie existiert, kombinieren Sie defined() mit constant(). Einen umfassenderen Überblick über das Erstellen von Konstanten finden Sie unter PHP Constants und Class Constants.