Session-Objekt sinnvoll?
foomaker
- php
0 dedlfix
0 Sympathisant0 Sven Rautenberg0 foomaker
Tach zusammen,
mal angenommen, es geht in mehreren php-Skripten einer site um Down-/Upload und Darstellung von Bildern (kann auch was anderes sein - egal). Dazu seien einige Funktionen deklariert, von denen mal die eine [scriptA.php -> funcA()], mal die andere [scriptB.php -> funcB()] gebraucht wird.
Bislang halte ich es so, dass ich die im jeweiligen Skript benötigten Funktionen am Anfang des Skripts inkludiere. Soweit so gut. Ich denke, so oder ähnlich machen das viele.
Nun meine Frage:
Was haltet Ihr davon, zu Beginn der Session, ein Objekt der Klasse IMG als "Session-Objekt" anzulegen, das alle Methoden zur Bildbehandlung bereits beinhaltet.
/* index.php */
class IMG
{
// Eigenschaften
private $var;
__construct()
{
//...
}
// Methoden
function funcA()
{
...
}
function funcB()
{
...
}
function getvar()
{
...
}
...
}
session_start();
if(!isset($_SESSION['imgobj']))
{
$_SESSION['imgobj']=new IMG();
}
/* scriptA.php */
$_SESSION['imgobj']->funcA();
/* scriptB.php */
$_SESSION['imgobj']->funcB();
Ich sehe da erstmal den Vorteil, dass ich nur ein einziges Mal (zu Beginn der Session) ein Objekt erstellen muss, aber dann im Verlauf der aktiven Session in jedem Skript Zugang zu allen relevanten Eigenschaften und Methoden habe, ohne darauf achten zu müssen, ob die jeweils benötigte Funktion (Methode) inkludiert ist, oder nicht.
Was spricht Eurer Meinung nach FÜR ein "Session-Objekt", was DAGEGEN.
Bin gespannt. ;-)
Gruß vom foomaker
echo $begrüßung;
Was haltet Ihr davon, zu Beginn der Session, ein Objekt der Klasse IMG als "Session-Objekt" anzulegen, das alle Methoden zur Bildbehandlung bereits beinhaltet.
Wenn du die Eigenschaften einer Session benötigst, erstell ein Objekt als Session-Variable. Wenn das Objekt nur für ein Script interessant ist, erstell ein normales Objekt. Wenn es nur darum geht, Funktionen an einem Fleck zu bündeln, aber eigentlich kein Objekt benötigt wird, nimm statische Methodenaufrufe.
Ich sehe da erstmal den Vorteil, dass ich nur ein einziges Mal (zu Beginn der Session) ein Objekt erstellen muss, aber dann im Verlauf der aktiven Session in jedem Skript Zugang zu allen relevanten Eigenschaften und Methoden habe, ohne darauf achten zu müssen, ob die jeweils benötigte Funktion (Methode) inkludiert ist, oder nicht.
Das ist nicht richtig. In einer Session werden nur Werte, nicht aber der Code von Methoden oder Funktionen abgelegt. Wenn ein Objekt aus einer Session wiederhergestellt werden soll, muss dessen Klassencode vorliegen. Wenn der sich in einer eigenen Datei befindet, dann muss diese bereits inkludiert worden sein (oder per Autoloading geladen werden können).
echo "$verabschiedung $name";
Hai Foomaker,
aus deinem Code wird mir nicht so recht ersichtlich, was deine Klasse ueberhaupt macht.
Zum einen der Name: IMG. Das impliziert, dass _eine_ Instanz dieser Klasse lediglich _ein_ Image repraesentiert. Doch deinem weiteren Text entnehme ich, dass es sich wohl eher um einen ImageHandler (o.ae.) handelt.
Des weiteren wird nicht ersichtlich, ob bzw. welche Membervariablen vorhanden sind.
Zudem verstehe ich folgende Aussage nicht:
[..] von denen mal die eine [scriptA.php -> funcA()], mal die andere [scriptB.php -> funcB()] gebraucht wird.
Denn: beide Methoden (funcA und funcB) sind ja in der IMG-Klasse vorhanden. Oder meinst Du, dass mehrere Scripte diese Klasse nutzen?
Letzteres ist ja ein ganz natuerlicher Fall.
Warum deklarierst Du die Methoden nicht als statisch - denn in deinem Konstruktor sehe ich keine Parameter).
Oder, wenn nur eine Instanz existieren soll, als Singleton.
Und dass die benoetigte Klasse automatisch inkludiert wird, kannst Du ja mittels Autoload loesen.
Vielleicht habe ich Dich aber auch ganz einfach nicht verstanden ;)
MfG,
Sympatisant
Moin!
Nun meine Frage:
Was haltet Ihr davon, zu Beginn der Session, ein Objekt der Klasse IMG als "Session-Objekt" anzulegen, das alle Methoden zur Bildbehandlung bereits beinhaltet.
Das bringt dir hinsichtlich Include-Vermeidung absolut nichts, da du vor dem Starten der Session den Code der Klasse includen musst, damit das in der Session gespeicherte Objekt wieder korrekt deserialisiert werden kann.
Sprich: Sofern deine Klasse nicht irgendwelche Objekteigenschaften definiert, sondern nur Code enthält, ist deine Idee absolut überflüssig.
Und selbst, wenn Eigenschaften vorhanden sind, ist es nicht zwingend gesagt, dass diese in einer Session persistent gemacht werden sollten.
Wenn du es leid bist, ständig für korrektes Include der benötigten Klassendefinitionen zu sorgen, dann informiere dich über Autoloading. Dazu gibts einen Artikel bei uns im Weblog: http://aktuell.de.selfhtml.org/weblog/php-autoload.
- Sven Rautenberg
Erst einmal Herzlichen Dank an alle für Antworten und Anregungen, ohne, dass ich jedem einzelnen antworte.
Dass die Klassendeklaration inkludiert werden muss, hatte ich nicht bedacht. Insofern stimmt der Einwand, dass ich mit einem Sessionobjekt hinsichtlich der Vermeidung von Funkionsdeklarationsincludes (mein Wort 2009 LOL) nichts gewonnen habe.
__autoload werde ich verwenden.
Auch wenn so nicht viel "gewonnen" ist, favorisiere ich die Verwendung von Klassen wg. der Kapselung von Eigenschaften und Methoden.
Ein Objekt in der Session zu speichern hat dann immerhin den Vorteil, dass dessen Eigenschaften erhalten bleiben und nicht in jedem neuen Skript neu definiert werden müssen.
Gruß vom foomaker