spezielle Objektreferenzen und deren weitergabe
Sadrak
- perl
So, ich habe mich mal in ein Gebiet gewagt wo sich leider niemand aus meinem Bekanntenkreis auskennt. Also muss ich euch leider hier mal bitten mir zu helfen.
Es dreht sich alles um OOP mit Perl.
Also, ich erstelle mir ein eigenes Objekt. Ich nenne es mal SPIELEROBJEKT
Nun erstelle ich in dem einen Script das Objekt, lade alle dateien die ich benötige rein und freue mich, das noch alles funktioniert.
( $spieler = SPIELEROBJEKT->new($name); )
nun steht also in $spieler die Referenz für das Objekt drin.
BSP: SPIELEROBJEKT=HASH(0x80fa20c)
Soweit so gut. Nun gebe ich aber mit einem Formular diese Referenz weiter, da ich das nun woanders bearbeiten will. Ich mache das über ein hidden etc. Ist jedenfalls egal.
Ankommen tut auch alles wie es soll. Sprich, ich kann in dem zweiten Script wieder problemlos auf $spieler zugreifen. Also auf die Referenz.
print $spieler; hat dann zur ausgabe:SPIELEROBJEKT=HASH(0x80fa20c)
Also alles schön und gut ... nur leider IST es nicht mehr mein Objekt! Keine Ahnung wieso er das macht. Aber, $spieler ist KEIN Spielerobjekt mehr. Es ist nur noch ein String. nix mehr. OK, nicht so schlimm dachte ich mir:
$spieler = bless($spieler , SPIELEROBJEKT);
und alles müsste wieder in butter sein ... nix da.
Can't bless non-reference value at ...
Naja, und an dem Punkt hörten dann meine Ideen auf ... Ich meine, WAS ZUM TEUFEL muss ich machen, damit ich wieder an mein Objekt komme???
Danke, Sadrak
Moin!
Naja, und an dem Punkt hörten dann meine Ideen auf ... Ich meine, WAS ZUM TEUFEL muss ich machen, damit ich wieder an mein Objekt komme???
Ich habe keine Ahnung von OOP unter Perl, aber schätzungsweise hast du in deinem ersten Skript ein Objekt aufgebaut mit mehrern Eigenschaften. Dieses Objekt ist aber ein komplexes Gebilde im Speicher, das man nicht so einfach als String in ein Hidden-Feld stecken kann. Denn im zweiten Skript existiert allenfalls das Template für dein Objekt - aber dessen Daten fehlen.
Vorgehensweise: Entweder extrahierst du alle zu übergebenden Eigenschaften per Hand aus deinem Objekt und packst sie in einzelne Hidden-Felder. Oder du schreibst deinem Objekt eine Methode zum Datenim- und -export, welche dann eine einfache Datenstruktur liefert, beispielsweise einen String.
- Sven Rautenberg
nix da :)
Das was ich weiter gebe ist ja nur die REFERENZ auf den Speicher an der Stelle wo mein Objekt ist ... also ich gebe ja nur nen String weiter!!!
easy :) noch jemand ne Idee? *g*
Moin!
Das was ich weiter gebe ist ja nur die REFERENZ auf den Speicher an der Stelle wo mein Objekt ist ... also ich gebe ja nur nen String weiter!!!
Ja, aber Script 2 weiß nichts vom Speicher des ersten Scriptes! Alles, was Script 1 angelegt hat, wird nach dessen Ende zerstört und freigegeben.
- Sven Rautenberg
Naja, jedenfalls danke. OK, du hattest halt nur gesagt, das ich nen ganzes Objekt weiter geben würde ... das war ja nicht der fall *g*
Hallo,
Soweit so gut. Nun gebe ich aber mit einem Formular diese Referenz weiter, da
ich das nun woanders bearbeiten will. Ich mache das über ein hidden etc. Ist
jedenfalls egal.
Das ist durchaus nicht egal.
Ankommen tut auch alles wie es soll. Sprich, ich kann in dem zweiten Script
wieder problemlos auf $spieler zugreifen. Also auf die Referenz.
print $spieler; hat dann zur ausgabe:SPIELEROBJEKT=HASH(0x80fa20c)
Also alles schön und gut ... nur leider IST es nicht mehr mein Objekt! Keine
Ahnung wieso er das macht. Aber, $spieler ist KEIN Spielerobjekt mehr. Es ist
nur noch ein String. nix mehr. OK, nicht so schlimm dachte ich mir:
$spieler = bless($spieler , SPIELEROBJEKT);
und alles müsste wieder in butter sein ... nix da.
Can't bless non-reference value at ...
Kein Wunder. Das Script ist zuende gelaufen und der Garbage Collector hat das
Objekt eingesammelt und den belegten Speicher wieder freigegeben.
Naja, und an dem Punkt hörten dann meine Ideen auf ... Ich meine, WAS ZUM
TEUFEL muss ich machen, damit ich wieder an mein Objekt komme???
Es gibt zwei Moeglichkeiten: entweder, du serialisierst dein Objekt und
entserialisierst es dann wieder, oder du benutzt Technologien wie CORBA. Das
serialisieren und wieder entserialisieren hat den entscheidenden Nachteil, dass
es extremste Sicherheitsluecken bietet: jeder koennte sich ein beliebiges
Objekt zusammenschustern, wenn er mal dein Format durchschaut hat. CORBA hat
den Nachteil, dass ein Daemon-Prozess im Hintergrund laufen muss.
Ich schlage vor, dass du dein Software-Design ueberarbeitest.
Gruesse,
CK