CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Entwicklung und Softwaredesign Hier können strukturelle (Programmier-) Konzepte diskutiert und Projekte vorgestellt werden |
25.07.2004, 14:53:42
|
Junior Member
|
|
Registriert seit: Aug 2002
Beiträge: 395
|
|
Klassen übergeben
Hi,
ich versuche in meine Klasse weitere Module zu laden indem ich neue Klassen erzeuge die eine Referenz der Hauptklasse bekommen. So sie das momentan bei mir aus:
Hauptklasse:
PHP-Code:
function loadModule($name) {
if(class_exists($name)) { //Klasse wurde gefunden
if(!$this->module[$name]) {
$this->module[$name] = new $name(&$this);
}
return true;
} else {
return false;
}
}
Die Hauptfunktion der neuen Klasse:
PHP-Code:
function module_artikelvote(&$parent) {
$this->main = &$parent;
return true;
}
Ich kann zwar auf $this->main->VARIABLE zugreifen, jedoch bekomme ich dort veraltete Werte, Funktionen gehen gar nicht, allerdings bekomme ich auch hier keine Fehlermeldung.
Hat jemand eine Idee woran das liegt?
|
27.07.2004, 00:51:59
|
Anfänger
|
|
Registriert seit: Jul 2004
Ort: Frankfurt am Main
Alter: 40
Beiträge: 43
|
|
Hi,
ich nehme mal an, dass du noch PHP 4 benutzt. Habe ein ähnliches System entwickelt und auch versucht Referenzen zu übergeben. Zum Beispiel um die Datenbank Klasse überall zu benutzen. In PHP 5 gehts, ansonste gibts ein unsägliches Chaos, dessen Ursache ich nicht wirklich feststellen konnte.
Die Lösung:
PHP-Code:
//im Modulmanager:
elseif ( $checkAcl) {
//Modul laden
$includePath = $this->moddir . "/" . modname . "/class.".$modname.".php";
require_once($includePath);
return new $modname();
}
//im Modul:
function defaultmod ( ) //Konstruktor
{
global $c_db, $c_usr, $c_tpl, $cnf;
$this->dbconn =& $c_db;
$this->uc =& $c_usr;
//etc. pp.
}
Ist nicht unbedingt sauber, aber funktioniert einwandfrei.
|
27.07.2004, 11:53:36
|
Junior Member
|
|
Registriert seit: Aug 2002
Beiträge: 395
|
|
Bei deiner Lösung habe ich aber, so wie ich das erkennen kann im Code 2 Variablen mit Klassen, für die Hauptklasse eine und für das Modul eine. Ich will das Modul aber über die andere Klasse aufrufen.
Allerdings habe ich mittlerweile den Eindruck, dass dieses Problem mit den veralteten Variabeln nur manchmal auftrifft, komischer weise.
Irgendwas stimmt hier hinten und vorne nicht!
Vielleicht liegt mein Problem auch hier:
if(!$this->module[$name]) {
$this->module[$name] = new $name(&$this);
}
Meine Klasse übergibt sich selbst in eine Session, sodass die Module auf der neuen Seite nicht neu initialisiert werden müssen, evt. gehen hierbei aber die Referenzen kaputt oder so!
|
27.07.2004, 12:05:48
|
Anfänger
|
|
Registriert seit: Jul 2004
Ort: Frankfurt am Main
Alter: 40
Beiträge: 43
|
|
Ah,
sach' das doch :)
Kennst / benutzt du die "magischen" Funktionen __sleep und __wakeup?
Details stehen im Manual. Aber kurz: __sleep wird beim serializen aufgerufen (also beim ablegen in die Session), __wakeup dagegen beim unserializen. Wenn du das Objekt aus der Session holst, werden dabei _nur_ die Variablen wieder hergestellt... du brauchst also einen initialisierungs Teil, der meißtens in etwa das tut, was auch der Konstruktor tut. Oder sogar nur diesen aufruft.
Hatte das gleiche Problem :P
MfG,
simon
|
27.07.2004, 12:28:41
|
Junior Member
|
|
Registriert seit: Aug 2002
Beiträge: 395
|
|
Zitat:
Original geschrieben von sniechzial
Wenn du das Objekt aus der Session holst, werden dabei _nur_ die Variablen wieder hergestellt... du brauchst also einen initialisierungs Teil, der meißtens in etwa das tut, was auch der Konstruktor tut. Oder sogar nur diesen aufruft.
|
Aber durch das Wiederherstellen der Variabeln wird doch auch die Variable mit dem Modul wieder aufgerufen, somit ist das Modul doch auch wieder geladen oder? Ich verstehe nciht ganz was ich in die Funktionen schreiben soll! Ich rufe die Klasse auf mit $com = klasse::loader(); und dieser Loader gibt dann $this zurück, intern schreibt er entweder $this = new KLASSE(); oder, wenn die Klasse durch die Session schon vorhanden ist gibt er $this direkt zurück!? Das funktioniert soweit eigentlich ganz gut, müsste doch auch mit den Modulen so klappen oder?
//EDIT: Hier mal die Funktionen:
PHP-Code:
function loader() { //Sollte nur von außen und nur zum initialisieren aufgerufen werden: $meineVar = community::loader();
if($_SESSION['community']) {
$this = unserialize($_SESSION['community']);
$this->community();
} else {
$this = new community();
}
if($this->userid == -1) { $this->autologin(); }
return $this;
}
function save() { //Sollte einmal am Ende es Dokuments aufgerufen werden
$_SESSION['community'] = serialize($this);
return true;
}
Geändert von mad-boy (27.07.2004 um 12:33:54 Uhr)
|
27.07.2004, 12:45:35
|
Anfänger
|
|
Registriert seit: Jul 2004
Ort: Frankfurt am Main
Alter: 40
Beiträge: 43
|
|
Hi,
wieso der umweg über ::loader()?
Das kannst du doch auch im Konstruktor machen, da der eh aufgerufen wird.
Die Objekte in dem Hauptobjekt werden ja auch serialisiert.
Sind die Klassen alle inkludiert? Sonst geht unserialize sowieso nicht.
Leider fehlt mir etwas der Überblick über dein Projekt, ich schau's mir später nochmal an wenn mehr Zeit ist.
|
27.07.2004, 13:46:19
|
Junior Member
|
|
Registriert seit: Aug 2002
Beiträge: 395
|
|
Der Umweg über den Loader weil ich im Header, der in jeder Datei der Seite includiert wird immer steht $com = community::loader(); wenn ich das über __wakeup mache dann muss ich ja drauf achten, dass ich nicht $com = new community(); mache wenn das schon aus den Sessions geholt wurde oder? :)
Daher der Umweg über community::loader(); und zum Schluss $com->save();
Die Klassen sind alle vorhanden, bei $com->save, was am Ende erst ausgeführt wird, wird ja das array $com->module[] mit serialisiert, wodurch ja das Modul auch serialisiert wird, oder nicht?
Ich will die Klasse irgendwann Public machen, und da soll die Benutzung möglichst einfach sein, deswegen möchte ich beim Laden uns Speichern der Klasse möglichst nur eine Zeile haben! :)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 04:08:12 Uhr.
|