[PHP/OOP] Grundliegende Frage zur Organisation von Klassen

theHacker

sieht vor lauter Ads, den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.643
1.280
Moin.

Ich probier grade ein wenig mit PHP5 rum und ich hätte da mal eine Frage.
Angenommen ich habe eine Klasse "Kern", die aus verschiedenen Einzelteilen besteht.
Wie schaffe ich es, dass die Einzelteile an eine Funktion des Kerns kommen.

Meine Überlegung war, dass ich jedem Einzelteil seinen Kern mitgeb.
Is das clever ? Oder kann ich das einfacher/anders lösen ?
PHP:
/* irgendwie so...*/

// kern.php5
class Kern
{
  private function foo()
  {
    $bar=new Einzelteil();
    $bar->setKern($this);
  }

  public function kernFunktion()
  {
    //...
  }
}

// einzelteil.php5
class Einzelteil
{
  private $kern = null;

  public function setKern(Kern &$kern) // <-- Referenz hier richtig ?
  {
    $this->kern=$kern;
  }

  private function foobar()
  {
    $this->kern->kernFunktion();
  }
}
 

leller

Well-known member
ID: 25817
L
6 Mai 2006
105
8
Viel Wege führen nach Rom.

Mal darüber nachgedacht, die Klasse Kern zu erweitern:

class Einzelteil extends Kern
{
function __construct()
{
parent::__construct();
}
}
 

theHacker

sieht vor lauter Ads, den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.643
1.280
Mal darüber nachgedacht, die Klasse Kern zu erweitern:
Das wäre eine Möglichkeit, aber falsch, da die Einzelteile ja nicht vom Kern abgeleitet werden, also bis auf den einen Aufruf keine der Eigenschaften oder Methoden hat.

Aber danke für deinen Post. Mir ist nämlich grade aufgefallen, dass die Methode, die auf die ichs abgesehen hab (Kern::kernFunktion()) statisch sein muss. Damit erledigt sich mein Problem erstmal :)
 

ice-breaker

return void
ID: 93995
L
27 April 2006
6.258
585
PHP:
public function setKern(Kern &$kern) // <-- Referenz hier richtig ?

in PHP5 ist dies nicht mehr notwendig, da Objekte, wie du es aus Java kennst (Java an die Macht *gg*) immer als Referenz übergeben, den Ampersand wie in PHP4 benötigst du also nicht mehr, also würde ich ihn auch weglassen

Edit: hast du dir schonmal überlegt Einzelteil von Kern abzuleiten? Weil so, ist das eigentlich ziemlicher Schmarn, dass deine Klasse auf einem Kern-Objekt aufbaut aber nicht von diesem abgeleitet ist.
 

theHacker

sieht vor lauter Ads, den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.643
1.280
in PHP5 ist dies nicht mehr notwendig, da Objekte, wie du es aus Java kennst (Java an die Macht *gg*) immer als Referenz übergeben, den Ampersand wie in PHP4 benötigst du also nicht mehr, also würde ich ihn auch weglassen
Kann ich das auch wo nachlesen ? Ich muss sagen, ich hab das Manual immer auf "OOP mit PHP5" offen gehabt, hab aber das nirgends gesehen. Hab sogar extra nochmal bei den Referenzen nachgeschlagen.
iEdit: hast du dir schonmal überlegt Einzelteil von Kern abzuleiten? Weil so, ist das eigentlich ziemlicher Schmarn, dass deine Klasse auf einem Kern-Objekt aufbaut aber nicht von diesem abgeleitet ist.
siehe Post #3, das wäre nicht korrekt.

Ums nicht so abstrakt zu machen:
Meine Idee war ein einfaches Diagramm zu machen, allerdings eben objekt-orientiert.
www.thehacker.ws/dummy/Klassen - Entwurf.pdf

ChartCore, eine abstrakte Klasse, die ein (nichts-tuendes) Diagramm stellt.
ChartText repräsentiert jegliches Geschreibsel (z.B. den Diagramm-Titel, der in ChartCore ist). ChartDataArea für die Diagramm-Fläche mit den Daten und ChartAxis stellt eine Achse dar.
Die einzelnen Diagrammen leiten dann ChartCore ab.

Das Problem, wegen welchem ich gefragt habe, war:
In ChartCore gibt es eine Methode getColor(), die mir ein GD-Handle für die Farbe gibt. Diese Methode muss in ChartCore sein, weil die ja jeder (ChartText, ....) benutzen können soll.
 

chrissel

Woohooo!
ID: 211634
L
20 April 2006
4.489
472
Wenn du setKern() immer nach dem initialisieren(oder wie man des nennt^^) aufrufst würde ich das direkt als Konstruktor verwenden.
Also so:

PHP:
/* irgendwie so...*/

// kern.php5
class Kern
{
  private function foo()
  {
    $bar=new Einzelteil($this);
  }

  public function kernFunktion()
  {
    //...
  }
}

// einzelteil.php5
class Einzelteil
{
  private $kern = null;

  public function __construct(Kern &$kern) // <-- Referenz hier richtig ?
  {
    $this->kern=$kern;
  }

  private function foobar()
  {
    $this->kern->kernFunktion();
  }
}
 

ZeroCCC

wasn das?
ID: 46810
L
10 Mai 2006
1.728
130
Das Problem, wegen welchem ich gefragt habe, war:
In ChartCore gibt es eine Methode getColor(), die mir ein GD-Handle für die Farbe gibt. Diese Methode muss in ChartCore sein, weil die ja jeder (ChartText, ....) benutzen können soll.

das ist aber prinzipiel genau sowas was man eigentlich mit vererbung regelt. du hast einen grundlegende funktionen die alle anderen elemente auch haben...

zb bei nen diagram... du hast einmal die arbeitsfläche und dann hast du verschiedene elemente die du auf dieser arbeitsfläche abbildest. jetzt könntest du ein objekt erstellen was die grundlegenden eigenschaften von einem element abbildet... zb farb, position und ka.

PHP:
class elemet {
  public function setColor() {
  }

  public function setPos() {
  }
}

und jetzt hast du zb ein text element

PHP:
class text_element extend element {
  public function setText() {
  }
}

jetzt könntest du zb noch das text element erweitern das du zb ein rahmen um den text bekommst.

PHP:
class border_text extend text_element {
  public function setBorder() {
  }
}

der sinn und unsinn der letzten klasse ist hier egal. sollte nur verdeutlichen was ich meine. du hast eine klasse die kern funktionen abbildet und die erweiterst du immer weiter.
 

ice-breaker

return void
ID: 93995
L
27 April 2006
6.258
585
Kann ich das auch wo nachlesen ? Ich muss sagen, ich hab das Manual immer auf "OOP mit PHP5" offen gehabt, hab aber das nirgends gesehen. Hab sogar extra nochmal bei den Referenzen nachgeschlagen.

Im Gegensatz wird mit '=' nur eine Referenz auf das Objekt erzeugt.
Quelle

ich habe es aus nem dicken Schmöker, im Netz ist es das beste was ich finden konnte, kannst es ja ausprobieren, wenn du mir nicht glaubst ;)
 

theHacker

sieht vor lauter Ads, den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.643
1.280
jetzt könntest du ein objekt erstellen was die grundlegenden eigenschaften von einem element abbildet... zb farb, position und ka.
Stimmt. Ein Objekt mit Farbe wäre die korrekte Lösung.
Nach einem Semester Algorithmik voller Objektorientierung mit Java hätte ich da eigentlich drauf kommen müssen :doh:Danke :)
Thx. Guck ich mir heute früh dann mal genauer an.
Mag an dieser Stelle Overkill sein, aber Du suchst scheinbar nach einer Factory Method.
Dieses Prinzip hab ich beim Googlen schon mal gesehen. Das trifft es aber eher weniger. ZeroCCC lag besser.

Was mir zu dieser Factory Method noch einfällt: Seh ich das richtig, dass das dieselbe Methode is, die auch Micro:money:oft's COM mit QueryInterface() nutzt ? *das COM nur mal im Manual nachgelesen, aber nie wirklich benutzt hab*
 

tleilax

be forever curious
ID: 27936
L
20 April 2006
1.845
183
Dieses Prinzip hab ich beim Googlen schon mal gesehen. Das trifft es aber eher weniger. ZeroCCC lag besser.
Ok, dachte bloss, Du wolltest keine Vererbung und da wäre dann die Factory das nächst naheliegende.

Was mir zu dieser Factory Method noch einfällt: Seh ich das richtig, dass das dieselbe Methode is, die auch Micro:money:oft's COM mit QueryInterface() nutzt ?
Kein Plan, kann aber gut sein. Man findet sowas schon desöfteren mal... ;)
 
Ähnliche Themen
Ersteller Titel Forum Antworten Datum
M Suche HILFE (Scritp PHP -> PDF) Programmierung 1

Ähnliche Themen