Objektinstanzierung mit Klassennamen aus Variablen – mit Namespaces! [PHP-Bug]

Gerade, als ich an meinem CMS weiter arbeitete, gelang mir ein kurioses Verhalten des PHP-Interpreters (5.3). Als ich ein Objekt durch einen dynamischen Klassennamen instanzieren wollte, wurde mir ein ‘Class not found’-Fehler geworfen.

Ich möchte das Problem und eine Lösung dafür beschreiben, zunächst aber eine Erklärung des Versuchs an einem konkreten Beispiel.

<?php
namespace main;
class Klasse {
	public function doAction() {}
}
?>
<?php
namespace main;
require_once 'klasse.php';
$classname = 'Klasse';
$object = new $classname();
?>

Man sollte meinen, dieser Code funktioniert, aber nein, das tut er nicht. Er wirft den Fehler „Fatal Error: Class ‘Klasse’ not found“.

Normalerweise braucht man bei der Instanzierung eines Objekts nicht den Namespace der Klasse angeben, sofern Klasse als auch Instanzierung im selben Namespace liegen. Doch dies scheint hier, bei einem dynamischen Klassennamen, nicht zu klappen. Dass Klasse definiert ist, bestätigt die Funktion class_exists().

Ich habe das Anliegen im PHP.de-Forum gepostet und darüber diskutiert. Wir kamen zum Ergebnis, dass der Namespace in $classname enthalten sein muss. Folglich funktioniert dieser Code:

<?php
namespace main;
require_once 'klasse.php';
$classname = 'main\Klasse';
$object = new $classname();
?>

Doch dies ist nur ein Workaround. Dass man bei einer dynamischen Objektinstanzierung den Namespace angeben soll, obwohl sie im selben Namespace liegen, ist Murks. Scheinbar verlässt der PHP-Interpreter den aktuellen Namespace-Scope als er den Inhalt von $classname ausließt. Ganz offensichtlich ein Bug.

Als universelle Lösung hat sich folgender Ansatz ergeben:

$classname = 'Klasse';
$classname = __NAMESPACE__.'\\'.$classname;

Ich hoffe in künftigen PHP-Versionen wird dieser Fehler berücksichtigt, denn diese Umgehung ist absolut nicht das Wahre.

Dieser Artikel wurde vertaggt mit , , , , , , , .
Kategorien: PHP, Sicherheit

Hat Ihnen dieser Artikel gefallen? - Dann abonnieren Sie vlblog um über neue Themen rund ums Web informiert zu werden.

Hinterlasse eine Antwort