Blaubart: CMS-Code ent-eval()-n

Mahlzeit.

Ich bin gerade dabei ein "CMS" (naja, nicht wirklich -- Grund folgt gleich) neuzuschreiben, das ich vor einer Weile für eine spezielle Seite programmiert habe. Ich möchte es nun so aufbauen, daß ohne großen Aufwand neue Module eingefügt werden können und das Programm universell(er) einsetzbar wird. Module sind in meinem Fall z.B. Galerien und Artikel. Hier im Forum bin ich auch schon über ein paar Beiträge zum Thema CMS gestolpert. Eine Frage habe ich dennoch...

In einer zentralen Datenbanktabelle sind alle Objekte mit jeweils ObjectId und Modultyp (ein String) vermerkt. Die eigentlichen Objekte speichere ich in entsprechenden Modultabellen. Um nun über die ObjektId auf den Inhalt eines konkreten Objektes zugreifen zu können, ermittle ich aus der zentralen Objekttabelle den Modultyp und weiß somit, in welcher Modultabelle ich nachschauen muß. Jedes Modul implementiert als eigenständige Klasse u.a. die Methode getContent():

if (class_exists($moduletype)) {
  eval("$pagecontents .= $moduletype::getContent($objectid);");
}
else ...

Dieses Prinzip funktioniert zwar, verursacht bei mir allerdings arge Bauchschmerzen was den Stil angeht -- vermutlich bin ich da auch nicht allein. ;)
Ich habe mir schon den Kopf über Alternativen zerbrochen, bisher aber nichts vernünftiges zustande gebracht. Hat jemand eine Idee, wie sich das auch ohne eval() bewerkstelligen läßt?

  1. echo $begrüßung;

    eval("$pagecontents .= $moduletype::getContent($objectid);");

    Dieses Prinzip funktioniert zwar, verursacht bei mir allerdings arge Bauchschmerzen was den Stil angeht

    Bereitet dir

    $pagecontents .= call_user_func(array($moduletype, 'getContent'), $objectid);

    weniger Bauchschmerzen?

    echo "$verabschiedung $name";

    1. 'Nabend.

      Bereitet dir call_user_func weniger Bauchschmerzen?

      Das tut es in der Tat. Diese Funktion war mir bisher gar nicht bekannt... Danke für den Tip.