Konstanten, Klassenkonstanten und der Zugriff
Variablen kennt jeder. Konstante werden deutlich seltener genutzt, haben aber auch ihre Daseinsberechtigung, vor allem bei Werten, die wir einmalig am Anfang setzen wollen und im späteren Verlauf auf keinen Fall geändert werden sollen.
Normale Konstanten in PHP werden angelegt mit
define('SERVICE_PORT', 312);
Darauf zugegriffen wird einfach mit dem Konstantennamen:
echo SERVICE_PORT;
In der objektorientierten Welt grauselt es einem, wenn man Konstanten einfach so in der Welt rumfliegen hat. Konstanten gehören meistens zu einer Klasse, und sollten demnach nicht im globalen Namensraum definiert werden.
Das kann man wie folgt machen:
class My_User { const STATUS_DELETED = -1; const STATUS_REGISTERED = 0; const STATUS_ENABLED = 1; private $_status; public function __construct() { $this->_status = self::STATUS_ENABLED; } }
Innerhalb der Klasse kann man also mit self und dem zweifachen Doppelpunkt darauf zugreifen. Von außerhalb der Klasse funktioniert das genauso:
echo My_User::STATUS_DELETED;
Etwas trickreicher ist es, wenn man den Konstantennamen in einer Variablen gespeichert hat und dann darauf zugreifen möchte. Hier mein erster Versuch, der natürlich nicht funktioniert hat:
$status = 'STATUS_REGISTERED'; echo My_User::$status;
In diesem Fall versuchen wir nicht, die Klassenkostante STATUS_REGISTERED auszugeben, sondern die statische Klassenvariable $status. Die Fehlermeldung lautet aussagekräftig:
Fatal error: Access to undeclared static property: My_User::$status in constant.php on line 17
Auch andere Versuche wie z.B.
echo My_User::'STATUS_REGISTERED'; echo My_User::{'STATUS_REGISTERED'};
scheitern.
Des Rätsels Lösung ist die PHP-Funktion constant(). Damit kann man nicht nur normale Konstanten abrufen, sondern auch Klassenkonstanten:
echo constant('SERVICE_PORT'); echo constant('My_User::' . $status);
———–
Es gibt übrigens noch eine weitere Methode, die man aber tunlichst NICHT verwenden sollte:
eval('echo My_User::' . $status . ';');
Geht nicht auch folgendes?
echo My_User::{$status};
Dennis Becker
17 Nov 09 at 17:42
Dann bekommt man:
Parse error: syntax error, unexpected ‚{‚, expecting T_STRING or T_VARIABLE or ‚$‘ in constant.php on line 17
Michael Kliewe
17 Nov 09 at 18:14