Aiun Geschrieben 22. August 2008 Geschrieben 22. August 2008 (bearbeitet) hi, folgendes Problem: Class A { public static $_mystructure = array(); public function doIt() { $struct = ... ???? print_r($struct); } public function doother() { $struct = ... ???? print_r($struct); } } class B extends A { public static $_mystructure = array("A","B","C"); } aufruf: $obj = new B(); $obj->doIt(); [/PHP] nun muss doIt() aber auf die static-information der Kind-klasse zugreifen....WIE ? ein self::$_mystructure gibt ja das Array der Parent-Klasse, mit dem ich nichts anfangen kann. Bisher löse ich es so, das die Kindklasse die Methoden überschreibt, dann die Parent-Methoden aufruft mit dem array als Parameter, das ist aber mist, denn alle Methoden müssen in alle Kindklassen mit rein, obwohl der Code überall 1:1 gleich ist. (es gibt derzeit so ca. 20 Kindklassen in diesem Fall und es werden mehr) hat jemand eine Idee ? danke Bearbeitet 22. August 2008 von Aiun Zitieren
Aiun Geschrieben 22. August 2008 Autor Geschrieben 22. August 2008 ich habe da einen funktionierenden Ansatz gefunden, aber irgendwie sieht das nicht sauber aus ... Meinungen ? <?php class A { public static $myvar = array(); public function doIt() { print_r(get_class_vars(get_class($this))); } } class B extends A { public static $myvar = array('Test'); } $obj = new B(); $obj->doIt(); ?> [/PHP] ergibt: Array ( [myvar] => Array ( [0] => Test ) ) Zitieren
Dragon8 Geschrieben 22. August 2008 Geschrieben 22. August 2008 Hm...also ich hab jetzt von PHP nicht so viel ahnung, aber eigentlich geht es dabei ja im Prinzip um OOP. Wenn du in deiner Basisklasse das Attribut $_mystructure brauchst du das selbe Attribut ja in der Kindklasse nicht nochmal anlegen, sondern musst in der Kindklasse das Objekt aus der Elternklasse nur noch mit deinen Daten befüllen, dann dürfte doch auch die Methode in der Elternklasse auf diese Datenzugreifen können. Im folgenden mal in Java dargestellt ( wie gesagt, PHP behersche ich nicht so): A import java.util.*; public class A { public static ArrayList $_mystructure; public void doIt() { ArrayList $struct = $_mystructure; System.out.println($struct); } } B import java.util.*; public class B extends A { //Konstruktor public B() { $_mystructure = new ArrayList(Arrays.asList(new String[]{"Test1", "Test2"})); } } Aufruf public class Aufruf { public static void main(String[] args) { B $obj = new B(); $obj.doIt(); } } Ausgabe [Test1, Test2] Zitieren
Aiun Geschrieben 22. August 2008 Autor Geschrieben 22. August 2008 das würde jedoch bedeuten, strukturinformationen die bei allen Objekten gleich sind, letztlich doch in jedem Objekt von neuem zu laden / im Speicher zu halten. und genau das will ich verhindern. (Performance ) Zitieren
Dragon8 Geschrieben 22. August 2008 Geschrieben 22. August 2008 Eigentlich nicht, dadurch dass das Objekt in der Elternklasse noch immer static ist, wird es ja trotzdem nur einmal erzeugt und damit auch im Speicher gehalten. Und jedesmal wenn eine Kindklasse erzeugt wird, wird der alte Inhalt dann eben überschrieben. Aber es bleibt nur 1 Objekt im Speicher. Jedenfalls denke ich, dass es so ist, berichtigt mich, wenn ich da falsch liege. Zitieren
Aiun Geschrieben 22. August 2008 Autor Geschrieben 22. August 2008 du hast recht, ich werde mir das mal genauer ansehen, deine Lösung sieht sauberer aus. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.