Veröffentlicht 22. August 200817 j 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 200817 j von Aiun
22. August 200817 j 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 ) )
22. August 200817 j 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]
22. August 200817 j 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 )
22. August 200817 j 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.
22. August 200817 j du hast recht, ich werde mir das mal genauer ansehen, deine Lösung sieht sauberer aus.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.