SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Der CSS-Problemlöser

Der CSS-Problemlöser zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Entwicklung und Softwaredesign
Hilfe Community Kalender Heutige Beiträge Suchen

PHP Entwicklung und Softwaredesign Hier können strukturelle (Programmier-) Konzepte diskutiert und Projekte vorgestellt werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 25.07.2004, 13:53:42
mad-boy mad-boy ist offline
Junior Member
 
Registriert seit: Aug 2002
Beiträge: 395
mad-boy eine Nachricht über ICQ schicken
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?
Mit Zitat antworten
  #2  
Alt 26.07.2004, 23:51:59
sniechzial sniechzial ist offline
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.
Mit Zitat antworten
  #3  
Alt 27.07.2004, 10:53:36
mad-boy mad-boy ist offline
Junior Member
 
Registriert seit: Aug 2002
Beiträge: 395
mad-boy eine Nachricht über ICQ schicken
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!
Mit Zitat antworten
  #4  
Alt 27.07.2004, 11:05:48
sniechzial sniechzial ist offline
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
Mit Zitat antworten
  #5  
Alt 27.07.2004, 11:28:41
mad-boy mad-boy ist offline
Junior Member
 
Registriert seit: Aug 2002
Beiträge: 395
mad-boy eine Nachricht über ICQ schicken
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 11:33:54 Uhr)
Mit Zitat antworten
  #6  
Alt 27.07.2004, 11:45:35
sniechzial sniechzial ist offline
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.
Mit Zitat antworten
  #7  
Alt 27.07.2004, 12:46:19
mad-boy mad-boy ist offline
Junior Member
 
Registriert seit: Aug 2002
Beiträge: 395
mad-boy eine Nachricht über ICQ schicken
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! :)
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:15:52 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt