Deklaration gleichnamiger Klassen in verschiedenen »Modulen« eines CMS

27apricot

Erfahrenes Mitglied
Hallo,

folgende Problemstellung:
  • für ein CMS habe ich in verschiedenen Modulen (z. B. Kalender und News) jeweils eine Klasse »ausgabe« mit teilweise gleichnamigen Methoden (Beispiel: zeige_db_eintraege())
  • Die Klasse »ausgabe« ist jeweils Kindklasse der Klasse »html«
  • eine Methode von »html« initialisiert nun für Kalender und News je ein Objekt der Klasse »ausgabe« aus dem jeweiligen Modul, vorher wird die Datei, welche die Klasse enthält jeweils mit »require_once« aufgerufen, um die Klasse zur Verfügung zu stellen
also:
PHP:
require_once $pfad_modul;
$obj_ausgabe = new ausgabe;
$echo = $obj_ausgabe->zeige_db_eintraege();

Beim Aufruf der Klasse aus dem zweiten Modul kommt nun die Fehlermeldung »Fatal error: Cannot redeclare class ausgabe in …«

Ich habe bereits versucht, die Klassen »ausgabe« als selbständige (und nicht als »html«-Kind-)Klassen zu deklarieren, doch auch das hat nichts geändert.

Eine Lösung, die funktioniert, ist, den Ausgabe-Klassen jeweils spezifische Namen zu geben (also »ausgabe_kalender« und »ausgabe_news«) und die Initialisierung des jeweiligen Objektes mit Hilfe der eval()-Funktion. Das sieht dann so aus:
PHP:
require_once $pfad_modul;
eval('$obj_ausgabe = new ausgabe_'.$modul.';');
$echo = $obj_ausgabe->zeige_db_eintraege();
Diese Lösung jedoch erscheint mir nicht sehr elegant. Hat jemand eine bessere Idee? Oder ist die Variante mit eval() doch »saubere Programmierung«?

Vielen Dank im Voraus,
27apricot
 
Moin,

das mit dem eval würde ich nicht als elegant ansehen :-)

Erstmal prinzipiell:
diese ausgabe-Klasse, ist diese in allen Modulen identisch?
Falls ja, dann solltest du diese von vornherein in der html-Klasse einbauen, und sie nicht über die Module daherkommen lassen.

Falls sie nicht überall identisch ist, dann ist es vom Sinn her nicht lögisch, diese ausgabe-Klasse des jeweiligen Modules als Kindklasse der html-Klasse anzulegen,
sinvoller wäre dann die ausgabe-Klasse als Kindklasse des jeweiligen Modules(sofern es ich dabei um Klassen handelt).
 
Hallo,

danke für die Antwort.
  1. nein, die ausgabe-Klassen sind nicht identisch, sondern modulspezifisch. Der Plan (der nicht aufging) war aber – im Sinne der »Dynamik« – den Klassen und der jeweils entscheidenden Methode den gleichen Namen zu geben, damit ich sie, wie oben beschrieben nach dem immer gleichen Muster aufrufen kann. Außer der Variante mit eval() habe ich eben auch noch keine Idee, wie das mit unterschiedlichen Klassen-Namen gehen könnte.
  2. in den Modulen gibt es nur die Klasse »ausgabe«. Wie ich schon schrieb, hatte ich diese versuchsweise schon so umgestrickt, dass sie eigenständig und nicht »html«-Kindklasse waren. Und um es nicht unversucht zu lassen, habe ich das nun noch einmal getan, dabei allerdings pro Modul eine eigenständige Klasse (mit jeweils unterschiedlichem Namen) mit den übergeordneten Funktionen geschrieben und jeweils dazu eine Kindklasse »ausgabe«, von welcher dann in der entsprechenden Methode von »html« ein Objekt erstellt wird. Mit der »html«-Klasse haben diese Klassen nun nichts mehr zu tun. Leider auch hier das erwartbare Ergebnis: die selbe Fehlermeldung.

Gibt es vielleicht einen Weg, eine aufgerufene Klasse nach der Verwendung wieder »unzugänglich« zu machen? Oder quasi zu überschreiben? Oder doch einen Weg, Klassen mit unterschiedlichen Namen dynamisch aufzurufen (wie oben in der Variante mit eval() beschrieben, nur eben ohne diesen Umweg)?

Vielen Dank im Voraus,
27apricot.
 
Wie wäre es denn so?
PHP:
<?php
class test1{
  function test1(){
    echo 'Test1';
  }
}
class test2{
  function test2(){
    echo 'Test2';
  }
}
$classes = array("test1", "test2", "test3");
foreach($classes as $c){
  if( class_exists($c) )
    $test = new $c;
  else
    echo "Klasse existiert nicht";
}
//test1 test2 Klasse existiert nicht
 
Hallo timestamp,

Vielen Dank! Das hier war der entscheidende Hinweis:
PHP:
$test = new $c;

Manchmal liegt die Lösung so nah. Ich hatte es nur nach dem Modell
PHP:
$test = new prefix_.$c;
versucht. Einfach den ganzen Klassen-Namen in eine Variable zu schreiben, ist mir noch nicht eingefallen. Blöde Betriebsblindheit manchmal.

Schöne Grüße,
27apricot
 
Zurück