Instanz einer Klasse global verfügbar machen
Günther S
- php
Hallo zusammen,
ich lese mich gerade in die Pseude-OOP von PHP ein und wollte eine Art Debug-Klasse erstellen.
Dabei füttere ich ein instanziertes Objekt mit Nachrichten unterschiedlicher Levels (ähnlich wie die PHP Errors 'notice', 'fatal error' usw.), die dann bei Bedarf ausgegeben werden können.
Nun möchte ich aber nur einmal eine Instanz dieser Klasse erstellen, und nur genau diese Instanz mit Nachrichten füttern.
Hier ein Bsp. zur Veranschaulichung:
// index.php
$debugger = new Debugger(); //
$debugger->addMsg("Ich wurde gerade in index.php erstellt");
// ...
include("news.php");
// ...
$debugger->showMsgs();
// news.php
// ...
$debugger->addMsg("Bin jetzt in der Datei news.php");
// ...
Angenommen ich ersetzte den Objektnamen $debugger durch $GLOBALS['debugger'] dann funktioniert das alles so - aber gibt es irgendeine Möglichkeit (unter PHP 4) auch $debugger global, also für eingebundene Dateien vergübar zu machen?
Gruß,
Günther
Hallo,
Deine Frage ist mir weitestgehen unverständlich, weil zu vermuten ist, daß Du de Hälfte verschweigst. Generell sind alle global definierten Variablen global verfügbar.
Also darf ich vermuten, das new Debugger(); in einer Funktion aufgerufen wird. Funktionen haben die Eigenschaft (genaugenommen macht sie dies Erst zu einer Funktion) Rückgabewerte zu erzeugen. Diese Rückgabewerten lassen sich auch in Variabeln fassen.
Wo genau besteht jetzt Dein Problem?
Gruß aus Berlin!
eddi
ja - das objekt ist global. es wurde in der index.php erzeugt. daher gehe ich davon aus, daß sich das objekt nicht in einem anderen befindet.
der fragesteller hat aber ein anderes verständnisproblem. er möchte dieses globale objekt in anderen objekten benutzen.
dies kann er aber nur erreichen, indem er dieses objekt in der klasse wo er es benutzen möchte als global deklariert.
ja - das objekt ist global. es wurde in der index.php erzeugt. daher gehe ich davon aus, daß sich das objekt nicht in einem anderen befindet.
Genau so ist es.
der fragesteller hat aber ein anderes verständnisproblem. er möchte dieses globale objekt in anderen objekten benutzen.
dies kann er aber nur erreichen, indem er dieses objekt in der klasse wo er es benutzen möchte als global deklariert.
Das war's, danke.
Ich habe bisher versucht, das Objekt $debug direkt an der Stelle, an der es erstellt wurde, global verfügbar zu machen.
Stattdessen muss das in den anderen Objekten/Funktionen/Dateien (z.B. 'news.php') geschehen, wo auf dieses Objekt zugegriffen wird.
Danke!
Gruß,
Günther
Hi,
Angenommen ich ersetzte den Objektnamen $debugger durch $GLOBALS['debugger'] dann funktioniert das alles so - aber gibt es irgendeine Möglichkeit (unter PHP 4) auch $debugger global, also für eingebundene Dateien vergübar zu machen?
Meines wissens nicht, auch nicht unter PHP5.
Was ich in solchen Fällen mache, ist ein
$debugger = $GLOBALS['debugger'];
am Anfang eines jeder Funktion, die diese Klasse verwenden soll.
Wenn du allerdings die Klasse Global definierst (laut deiner Beschreibung definierst du die innerhalb einer Funktion), steht die auch Global zur Verfügung. Logischerweise aber nicht in anderen Funktionen, da musst du die per GLOBALS wieder sichtbar machen.
Ich geh dabei von register_global off aus. Ob es sich mit Klassen und register_globals on anders verhält hab ich nie probiert, da ich grundsätzlich register_globals ausgeschalten hab auf meinem Entwicklungsrechner und auch auf meinen Server im RZ (Auch wenn einige Scriptkiddies unter meinen Kunden meutern wollen)
echo $begrüßung;
Nun möchte ich aber nur einmal eine Instanz dieser Klasse erstellen, und nur genau diese Instanz mit Nachrichten füttern.
Du könntest das Problem mit dem Singleton-Pattern lösen. Alternativ kann ich mir auch statische Methodenaufrufe vorstellen, die dann ihrerseits per Singleton-Pattern die Instanz ansprechen. Die statischen Methodenaufrufe haben den Vorteil, dass nicht jedes Mal eine Instanz im aktuellen Scope zu liegen kommt, bzw. erst eine Instanz geholt wird, bevor auf sie zugegriffen werden kann.
echo "$verabschiedung $name";