Too Cool for Internet Explorer

PHP serialize - PHP::Serialization


Ich muss ein PHP object über 'serialize' serialisieren, an Perl weiterreichen und dort über das Modul PHP::Serialization auspacken. Ich habe Stunden damit zugebracht herauszufinden, warum ich auf meine Objektvariablen nicht zugreifen kann.

class test {
  public $public_key = 'public_val';
  private $private_key = 'private_val';
}

"Eigentlich" ist es logisch, dass PHP "auf irgendeine Art und Weise"" im serialisierten String kenntlich machen muss, welche Bestandteile des Objekts private und welche public sind, da ansonsten PHP selbst das Objekt nicht mehr korrekt deserialisieren könnte. Solchen Fragen muss man sich aber erst stellen, wenn man ein seralisiertes Objekt mit etwas anderem als PHP weiterverarbeiten möchte ... . Der Data::Dumper von Perl jedenfalls gibt für das deserialisierte Objekt folgendes zurück:

$VAR1 = bless( {
  'public_key' => 'public_val',
  'testprivate_key' => 'private_val'
}, 'PHP::Serialization::Object::test' );

Die Ausgabe von ...

print Dumper($obj->{'testprivate_key'});

... liefert jedoch ein "undef" - was ist da los? Ganz einfach: PHP fügt nicht nur den Namen der Klasse in den Namen der Objektvariablen beim Serialisieren des Objektes ein, sondern zusätlich vor und hinter dem Namen der Klasse je ein null-Byte:

0000000: 4f3a 343a 2274 6573 7422 3a32 3a7b 733a O:4:"test":2:{s:
0000010: 3130 3a22 7075 626c 6963 5f6b 6579 223b 10:"public_key";
0000020: 733a 3130 3a22 7075 626c 6963 5f76 616c s:10:"public_val
0000030: 223b 733a 3137 3a22 0074 6573 7400 7072 ";s:17:".test.pr
0000040: 6976 6174 655f 6b65 7922 3b73 3a31 313a ivate_key";s:11:
0000050: 2270 7269 7661 7465 5f76 616c 223b 7d   "private_val";}

Ein Dank an dieser Stelle geht an Plu, der mir beim Debuggen geholfen hat und nicht müde wird all meine Perl-Fragen zu beantworten.



Trackbacks

Keine Trackbacks

Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

ist
class test {
public $public_key = 'public_val';
private $private_key = 'private_val';
}
nicht totaler schwachsinn seit php5?

es muesste nach E_STRICT sein:

class test {
static public $public_key = 'public_val';
static private $private_key = 'private_val';
}

oder aber die felder muessten im constructor definiert werden, wenn sie nicht static sind
#1 egal am 01.11.2007 20:31 (Reply)

Ja, mir ist auch schon öfters aufgefallen, wie schlecht doch die PHP Dokumentation ist, insbesondere die Deutsche. Die deutsche Version ist oftmals auf einem alten Stand und enthält fatale Fehler, die meistens auf Übersetzungsfehler zurückzuführen sind. Funktionen von Erweiterungen wie SQLite und MySQLi sind teilweise gar nicht übersetzt worden oder enthalten massenhaft Fehler. Ein sehr schönes und trauriges Beispiel:

http://www.php.net/manual/de/function.sqlite-next.php
Diese Funktion kann nicht mit ungebufferten Ergebnisses genutzt werden.

Die Englische Dokumentation erwähnt diesen Satz erst gar nicht. Daher gehe ich davon aus, dass sich die Übersetzer nicht die Mühe gemacht haben, bei der Original Version zu schauen, sondern einfach die Anmerkung von sqlite_seek() übernommen haben. Ein weiteres Beispiel:

http://de.php.net/manual/de/function.sqlite-seek.php
Die Zeilennummerierung beginnt mit Zeile 1

http://de.php.net/manual/en/function.sqlite-seek.php
0 is the first row

Was ist denn nun richtig?!

Folgender Auszug kann zu schwerwiegenden Fehlern führen:

http://de.php.net/manual/de/function.sqlite-unbuffered-query.php
"funktionieren mit mit Abfrageresultaten"

Die Englische Dokumentation sagt, dass sqlite_unbuffered_query nicht mit Abfrageresultaten funktioniert.

Folgender Fehler kann auch fatal enden:

http://de.php.net/manual/de/function.sqlite-open.php
Der Standardwert für Modus ist der oktale Wert 06666.

Richtig ist aber, wie im Beispiel zu sehen, dass der Standardwert 0666 ist.

Teilweise ist die englische Dokumentation viel gründlicher und genauer (siehe MySQLi Extension). Ich verwende ab sofort nur noch die Englische Dokumentation. Das Risiko möchte ich einfach nicht eingehen, dass solche Fehler in meinen Codes auftreten.

Bzgl. des ersten Kommentars: Ich setze immer in meinen PHP5 Klassen einen Standardwert, um anderen Entwicklern das Verstehen des Codes etwas zu erleichtern, ob dies nach E_STRICT eine statische Variable sein muss, um einen Wert zu besitzen, ist mir nicht bekannt. Wäre die Variable statisch, kann man nicht über $this auf die Eigenschaft zugreifen, sondern kann nur mit dem "self" und zwei darauffolgenden Doppelpunkten auf diese Eigenschaft zugreifen.

Gruß
Tim
#2 tim am 05.11.2007 18:30 (Reply)


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA