Von einer Klasse auf eine andere zugreifen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aufrufen
code
dank
erfolg
funktion
instanz
klasse
mache
message
methode
normale funktion
objekt
problem
statische methode
statischen methoden
test
type
url
zugreifen
zugriff
-
Hallo,
ich habe momentan folgendes Problem:
ich habe eine include.php Datei, welche "leicht" verkürzt so aussieht:
<?php // Laden der Objekte/Klassen $oGeneral = new general(); $oUser = new user(); [...] class general { [...] public function sendmail($mailto,$subject,$message) { [...] // Weitere Header-Angaben $headers = "Content-Type: text/plain; charset = \"UTF-8\";\n"; $headers .= "Content-Transfer-Encoding: 8bit\n"; mail($mailto, $subject, $message, $header); } [...] } class user { [...] public function logwrite($action,$extended) { if (!isset($this->user_id)) $uid=0; else $uid=$this->user_id; if (mysql_query ("INSERT INTO `tests_log` ". "(uid,action,ext) VALUES ". "($uid, '$action', '$extended')")) { $lid = mysql_insert_id(); $headers = "Content-Type: text/plain; charset = \"UTF-8\";\n"; $headers .= "Content-Transfer-Encoding: 8bit\n"; $headers .= "\n"; mail ("meine.email@provider.de" , "[Log] $action ($lid)" , "Aktion: $action\nErweitert: $extended\nBenutzer-ID:$uid\nZeit: ".date("d.m.Y H:i:s",time()), $headers); } } } [...] ?>
in der Funktion $oUser->logwrite(...) sende ich eine E-Mail an meine Adresse, die mich von dem Log Eintrag in Kenntnis setzt..
Beide Funktionen müssen in ihren Klassen bleiben, da sie dort auf Funktionen zugreifen bzw als Funktion gebraucht werden
nun habe ich jedoch bereits die Funktion $oGeneral->sendmail(...), in welcher ich Headerangaben usw alles schon eingestellt habe, und die ich gerne für den E-Mail-Versand nutzen würde... nun meine Frage:
Wie kriege ich es hin, in der Klasse user auf eine Funktion der Klasse general zuzugreifen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Entweder du übergibst das Objekt der general - Klasse als Funktionsparameter an deine logwrite() Methode oder
du machst aus deiner sendmail() Methode eine statische Methode und rufst sie dann ganz normal auf.
static public function sendmail(..){ ... } //Und rufst sie dann entsprechend auf general::sendmail(...);
Oder was vielleicht sinnvoller ist:
logwrite($action, $extended, general &$general){ $general -> sendmail(...); }
Beitrag zuletzt geändert: 4.4.2012 22:39:06 von finc -
ok, danke, werd ich gleich mal ausprobieren...
nur zum verständnis:
was ändert static an der Funktion?
(also bei Variablen werden die dann nur beim 1. Aufruf definiert, okay, aber in ner Klasse bei einer Funktion?)
und kann ich dann immernoch in der klasse mit
$this->sendmail(...);
und von außerhalb mit
$oGeneral->sendmail(...);
drauf zugreifen?
edit: also das mit static und in der andren Klasse benutzen geht schonmal, aber verstehn tu ichs trotzdem nochned so ganz :)
wär nett, wenn du das noch kurz erklären könntest..
Beitrag zuletzt geändert: 4.4.2012 22:38:59 von fr34qy -
was ändert static an der Funktion?
(also bei Variablen werden die dann nur beim 1. Aufruf definiert, okay, aber in ner Klasse bei einer Funktion?)
Wenn du eine Methode als statisch definierst ist das praktisch wie eine normale Funktion.
Der Zugriff verändert sich etwas und du musst die Klasse nicht instanziert haben, um auf die Methode zugreifen zu können.
und kann ich dann immernoch in der klasse mit
$this->sendmail(...);
und von außerhalb mit
$oGeneral->sendmail(...);
drauf zugreifen?
Der zugriff würde dann immer so erfolgen $general::sendmail() oder general::sendmail,
von Außen, von Innen weiß ich es gerade nicht.
Du kannst aber von statischen Methoden aus nicht auf nichtstatische Klassenmethoden zugreifen.
(Glaub ich, weiß es grade nicht genau verwende nie welche ^^)
Ich hatte geschrieben, eine statische Methode wäre sinnvoller, war aber blödsinn. :D
Beitrag zuletzt geändert: 4.4.2012 22:46:44 von finc -
also geht es auch, dass ich in ner Klasse user
auf ne instanz $oGeneral von general zugreife, indem ich einfach
$oGeneral -> sendmail(...) mache?
hmm hatte eigentlich gedacht, dass das ned geht, naja, mal ausprobieren -
also geht es auch, dass ich in ner Klasse user
auf ne instanz $oGeneral von general zugreife, indem ich einfach
$oGeneral -> sendmail(...) mache?
Unter der Vorraussetzung, dass du irgendwo ein Objekt von general erzeugt oder per Parameter übergeben hast. -
was meinst du mit "irgendwo erzeugt" - reicht das, wie in meiner include.php oberhalb der Klassen,
wo es eigentlich vom gesamten Script aus zugänglich ist oder muss ich das in der Klasse nochmal machen?
(was ja auch blöde wäre, weil es dann ja ne neue Instanz ist) -
was meinst du mit "irgendwo erzeugt" - reicht das, wie in meiner include.php oberhalb der Klassen,
wo es eigentlich vom gesamten Script aus zugänglich ist oder muss ich das in der Klasse nochmal machen?
Das war jetz allgemein gemeint, du kannst ja eine schon vorhandene Instanz übergeben.
Du musst halt nur eine Instanz haben wenn du mit dem hübschen hier " -> " drauf zugreifen willst. ;)
Ansonsten bleibt dir die statische Möglichkeit. ^^
Musst halt sehen und rumprobieren, kenn ja dein Code nicht. ;)
Ich würde an deiner stelle sowieso z.B. in deiner Kopfdatei eine Funktion oder Klasse definieren,
die das Senden von Mails übernimmt, dann hättest du schon mal ein Problem weniger. ;) -
und diese Klasse dann statisch machen oder wie?
nach dem motto:
static class mail { public function send(..) { .... } }
oder geht das ned und muss so aussehn:
class mail { static public function send(..) { .... } }
oder wie meinst du das jetzt? -
Ich meine eigentlich eine Stinknormale Funktion nach dem Motto
function sendmail(...){ ... }
Oder halt eine Klasse die du dann instanzierst und dann halt deine Mail sendest.
Und nein, du kannst eine Klasse nicht als statisch definieren. ;) -
ja, aber wenn ich die Klasse instanziere, dann kann ich ja innerhalb von andren klassen wieder ned auf die instanz zugreifen, oder?
stinknormale funktion könnte man sich eigentlich überlegen :D aber ich mags lieber, wenn alles aufgeräumt ist ^^ -
ja, aber wenn ich die Klasse instanziere, dann kann ich ja innerhalb von andren klassen wieder ned auf die instanz zugreifen, oder?
Na doch solange du diese Instanz als Methodenparameter übergibst.
$mail = new Mail(); $deineklasse = new deineklasse(); $deineklasse -> IrgendwasWasDeineMailInstanzBraucht($mail);
stinknormale funktion könnte man sich eigentlich überlegen :D aber ich mags lieber, wenn alles aufgeräumt ist ^^
Es muss ja nicht unaufgeräumt sein, nur weil es nicht in einer Klasse liegt. ;)
Naja, aber das ist deine Sache. ^^
Würdest du jetz ne Klasse Mail mit der statischen Funktion schreiben,
wie du es beschrieben hattest, würde es ja auf's selbe rauskommen wie eine normale Funktion.
class mail { static public function send(..) { .... } }
Deswegen verwende ich auch keine statischen Methoden,
weil es halt auf's selbe raus kommt wie mit einfachen Funktionen.
Aber das ist ja dir überlassen. ;) -
finc schrieb:
ja, aber wenn ich die Klasse instanziere, dann kann ich ja innerhalb von andren klassen wieder ned auf die instanz zugreifen, oder?
Na doch solange du diese Instanz als Methodenparameter übergibst.fr34qy schrieb:
was meinst du mit "irgendwo erzeugt" - reicht das, wie in meiner include.php oberhalb der Klassen,
wo es eigentlich vom gesamten Script aus zugänglich ist oder muss ich das in der Klasse nochmal machen?
(was ja auch blöde wäre, weil es dann ja ne neue Instanz ist)fr34qy schrieb:
Wenn die Instanz also global zugänglich ist kannst du auch von deiner Funktion in deiner Klasse darauf zugreifen. Damit das funktioniert musst du in der Funktion folgendes schreiben:
also geht es auch, dass ich in ner Klasse user
auf ne instanz $oGeneral von general zugreife, indem ich einfach
$oGeneral -> sendmail(...) mache?
Damit bekommst du Zugriff auf deine globale Variable.global $oGeneral;
finc schrieb:
Das sollte immer so aussehen (von Außen sowie von Innen):
Der zugriff würde dann immer so erfolgen $general::sendmail() oder general::sendmail,
von Außen, von Innen weiß ich es gerade nicht.
Die Variante mitgeneral::sendmail();
funktioniert ebenfalls.$this->sendmail();
-
Ich verstehe das Problem nicht, das funktioniert doch alles super:
<?php class KlasseEins { var $test; function __construct() { $this->test = new KlasseZwei; } public function aufrufAusKlasseEins() { $this->test->testMethode(); } } class KlasseZwei { public function testMethode() { echo "test wurde aufgerufen<br />"; } } $eins = new KlasseEins; $eins->aufrufAusKlasseEins(); $eins->test->testMethode(); ?>
Man kann "testMethode()" entweder innerhalb der Klasse oder von außerhalb aufrufen, alles garkein Problem. -
trueweb schrieb:
Natürlich funktioniert das, der TE muss aber bei seinem Vorhaben einmal global $klasse; verwenden um auf seine globale Variable innerhalb einer Funktion zugreifen zu können.
Ich verstehe das Problem nicht, das funktioniert doch alles super:
[...]
Man kann "testMethode()" entweder innerhalb der Klasse oder von außerhalb aufrufen, alles garkein Problem. -
hackyourlife schrieb:
trueweb schrieb:
Natürlich funktioniert das, der TE muss aber bei seinem Vorhaben einmal global $klasse; verwenden um auf seine globale Variable innerhalb einer Funktion zugreifen zu können.
Ich verstehe das Problem nicht, das funktioniert doch alles super:
[...]
Man kann "testMethode()" entweder innerhalb der Klasse oder von außerhalb aufrufen, alles garkein Problem.
Es ist nicht gerade schön, globale Variablen/Klassen zu verwenden. Viel eher sollte er statt:
$oGeneral = new general(); $oUser = new user();
es so machen, dass $oUser eine Klasse innerhalbt von $oGeneral ist (siehe mein Beispiel, KlasseZwei ist ein Objekt innerhalb von KlasseEins) oder je nach Sinn und Zweck eben andersrum. -
@trueweb: ich würde aber gerne keine zweite Instanz meiner Klasse in der anderen Klasse initialisieren,
da ich ja dann auf die Variablen usw der ersten Instanz nicht zugreifen kann,
oder sehe ich das falsch?
global $oGeneral; $oGeneral->sendmail(..);
funktioniert soweit ich das beurteilen kann...
ich würd dann des verwenden, außer es gibt ne bessere lösung...
kann ich global $oGeneral; auch in der Klasse aber außerhalb von den Funktionen schreiben,
sodass sie allgemein in der Klasse zugänglich ist?
@finc: ich würde ungern einen weiteren Parameter einbauen, das macht die Funktion nur jedes mal unübersichtlicher...
und außerdem will ich ja eh immer die gleiche Variable übergeben, also find ich die lösung nicht so toll... aber danke für den vorschlag :)
Gruß und Danke an alle fürs Antworten -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage