Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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 von Aiun

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 ) )

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]

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 :) )

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.

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.