PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘Konstanten’ tag

Konstanten, Klassenkonstanten und der Zugriff

with 2 comments

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 . ';');

Written by Michael Kliewe

Oktober 28th, 2009 at 8:28 am

Posted in PHP

Tagged with , , ,