Seite 1 von 1

eine Klasse ruft die andere auf.

Verfasst: 01.02.2014, 16:15
von umwelt
Hallo,
ich arbeite mich gerade in die objektorientierte Programmierung in PHP ein und habe schon einige tutorials durchgelesen und -geackert, werde aber noch nicht ganz schlau.

es geht um ein einfaches foren-system...

es gibt die klasse forum, die mehrere methoden zur erstellung von threads, antworten usw enthält.

es gibt außerdem die klasse htmlmails, über die html-emails versendet werden können. auch aus der forum-klasse sollten html-mails übermittelt werden. muss ich die htmlmails-klasse dem konstruktor der forum-klasse übergeben? oder wie läuft das am besten?

oder htmlmails extends forum?

viele grüße!

Verfasst:
von

Verfasst: 01.02.2014, 21:18
von ElDiablo
Fang vielleicht mal mit einem Buch zu PHP an.
Es sollte sich hier recht einfach mittels "extends" vererben lassen, auch wenn ich in PHP nicht sonderlich bewandert bin.

Also z.B. wenn A die Funktionen von B bekommen soll:
class class_A extends class_B { }

Verfasst: 01.02.2014, 21:20
von Thomas B.
Du kannst keine Klassen im Konstruktor übergeben, das geht in keiner Sprache ...

Ich weiß nicht wie deine Klassen Aufgebaut sind aber ich würde die Funktionalität in einer Klasse belassen und dann ein neues Objekt aufrufen. Extends verwendet man nur bei Spezialisierungen einer Klasse.

zB:

Code: Alles auswählen

class Mail {...}

class TextMail extends Mail {...}
class HtmlMail extends Mail {...}
In deiner Foren Klasse würde ich dann das entsprechende Objekt erzeugen.

zB:

Code: Alles auswählen

class Forum {
  private function _foo(){
    $mail = new HtmlMail();
  }
}

Verfasst: 01.02.2014, 21:37
von umwelt
hi thomas b,
ja, prinzipiell hatte ich auch an sowas gedacht, bloß woher weiß die methode _foo, wo die methode htmlmail() der externen klasse definiert ist?

bislang übergebe ich einer klasse auch die objekte für mysql-klasse und weitere klassen...

Code: Alles auswählen

public function __construct($obj1,$obj2)
so wurde mir das empfohlen, wenn ich aus der klasse auf die objekte $obj1 oder $obj2 zugreifen möchte. das htmlmail-objekt könnte ich ebenfalls übergeben... aber ich finde den weg etwas unpraktisch, da ich ja die variablen in der methode vorgeben muss und das nachträglich umständlich zu erweitern ist.


viele grüße!

Verfasst: 01.02.2014, 22:51
von Thomas B.
Ja das nennt man dependency injection, aber wenn das Objekt in der Funktion erzeugst brauchst du das nicht.

Du könntest dir auch eine globale Registry anlegen, über die du dir die Referenzen auf die Objekte holst.

Du könntest dir auch eine Factory anlegen.

_foo() muss nicht wissen wo die Klasse definiert ist. Mit new HtmlMail(); erzeugst du das Objekt, nachdem du die Mail gesendet hast löscht du es einfach wieder, du musst die Referenz nicht aufrecht halten. Oder sind es so viele eMails die gesendet werden?

Verfasst: 01.02.2014, 23:39
von umwelt
Thomas B. hat geschrieben:aber wenn das Objekt in der Funktion erzeugst brauchst du das nicht.
ich stehe da leider auf dem schlauch, denn was ich probiert habe, funktioniert nicht.

hast du evtl. ein paar zeilen code?

klasse forum liegt in der datei klassen/forum.php
klasse newsletter liegt in der datei klassen/newsletter.php

in der datei thread.php soll die klasse forum instanziert(?) werden und deren methode erstelle() aufgerufen werden, die die methode htmlmail() der klasse newsletter ausführen soll.

wäre eine große hilfe! ich werde mir auch gleich nochmal ein php-buch in der bücherei reservieren!

viele grüße!

Verfasst: 02.02.2014, 02:15
von Thomas B.
Hast du die Datei geladen?

https://www.php.net/manual/de/function.include.php

bzw arbeitest du mit Namesräumen?

Verfasst: 02.02.2014, 11:42
von umwelt
Hi,

ein code-beispiel:

index.php

Code: Alles auswählen

<?php
include&#40;"eintrag.php"&#41;;
include&#40;"mailer.php"&#41;;

// Wird auf jeder Seite referenziert
$mailer= new Mailer&#40;&#41;;

$eintrag = new Eintrag&#40;&#41;;
$eintrag->eintragen&#40;"testbeitrag"&#41;;
?>
eintrag.php

Code: Alles auswählen

<?php
class Eintrag &#123;
	
	public function eintragen&#40;$text&#41; &#123;
	echo "Eingetragen wurde '".$text."'";
	
	// Nun Email versenden
	echo $mailer->sendHTMLMail&#40;$text&#41;;
	&#125;

&#125;
mailer.php

Code: Alles auswählen

<?php
class Mailer &#123;
	function sendHTMLMail&#40;$t&#41; &#123;
	//Mail senden
	return "Mail '".$t."' wurde versandt";
	&#125;
&#125;
?>
das objekt newsletter soll auch im normalen kontext von index.php abrufbar sein.
ich könnte es ja an die klasse Eintrag übermitteln $eintrag = new Eintrag($newsletter), wollte das aber vermeiden, weil sich die parameterzahl ja ändern könnte...

wie löse ich das denn am saubersten?

viele grüße!

Verfasst: 02.02.2014, 13:13
von Thomas B.
Schau dir mal das Entwurfsmuster der Registry an, ich glaube das ist es was du suchst. Mit (zB.) der Datenbankanbindung wirst du ja vor dem selben Problem stehen.

https://www.phpbar.de/w/Registry

Verfasst: 02.02.2014, 13:43
von umwelt
hi, das sieht interessant aus.
ja, das db-objekt habe ich immer per parameter übergeben...
mit der registry wäre das dann nur ein parameter ($registry). nicht?

Verfasst: 02.02.2014, 22:51
von Thomas B.
Die Registry ist eine statische Klasse und überall sichtbar. Die brauchst du nicht als Variable übergeben.