<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'language.oop5.serialization.php',
    1 => 'Serialisierung von Objekten',
    2 => 'Serialisierung von Objekten - Objekte in Sessions',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Klassen und Objekte',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.references.php',
    1 => 'Objekte und Referenzen',
  ),
  'next' => 
  array (
    0 => 'language.oop5.variance.php',
    1 => 'Kovarianz und Kontravarianz',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/oop5/serialization.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.serialization" class="sect1">
  <h2 class="title">Serialisierung von Objekten - Objekte in Sessions</h2>
  

  <p class="para">
   <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> erzeugt einen String, welcher
   die Byte-Stream-Repräsentation eines jeden Wertes besitzt,
   der in PHP gespeichert werden kann.
   <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> kann diesen String verwenden,
   um die ursprünglichen Variablenwerte wiederherzustellen. Verwendet
   man <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span>, um ein Objekt zu speichern,
   so werden alle Variablen dieses Objektes gespeichert. Die
   Methoden des Objektes werden nicht gespeichert, nur der Name
   der Klasse.
  </p>

  <p class="para">
   Damit man imstande ist, ein Objekt mit <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span>
   wiederherzustellen, muss die Klasse des Objektes definiert sein.
   Das heißt, wenn man ein Objekt der Klasse A serialisiert, erhält man
   einen String, der sich auf die Klasse A bezieht und die Werte
   aller darin enthaltenen Variablen beinhaltet. Wenn man in einer
   anderen Datei diesen String wieder zu einem Objekt der Klasse A
   deserialisieren will, so muss die Klasse A in dieser Datei
   vorher bekannt sein. Dies kann man erreichen, indem man die
   Definition der Klasse A in eine mittels include
   ladbare Datei auslagert und diese Datei einbindet oder die Funktion
   <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> verwendet.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// A.php:<br /><br />  </span><span style="color: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />      public </span><span style="color: #0000BB">$one </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br />      public function </span><span style="color: #0000BB">show_one</span><span style="color: #007700">() {<br />          echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">one</span><span style="color: #007700">;<br />      }<br />  }<br /><br /></span><span style="color: #FF8000">// page1.php:<br /><br />  </span><span style="color: #007700">include </span><span style="color: #DD0000">"A.php"</span><span style="color: #007700">;<br /><br />  </span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">;<br />  </span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #0000BB">serialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />  </span><span style="color: #FF8000">// $s irgendwo ablegen, wo page2.php dies finden kann.<br />  </span><span style="color: #0000BB">file_put_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'store'</span><span style="color: #007700">, </span><span style="color: #0000BB">$s</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// page2.php:<br /><br />  // Dies ist nötig, damit unserialize korrekt funktioniert.<br />  </span><span style="color: #007700">include </span><span style="color: #DD0000">"A.php"</span><span style="color: #007700">;<br /><br />  </span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'store'</span><span style="color: #007700">);<br />  </span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">unserialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$s</span><span style="color: #007700">);<br /><br />  </span><span style="color: #FF8000">// Nun kann man die Funktion show_one() des Objektes $a<br />  // verwenden.<br />  </span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">show_one</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <p class="para">
   Es ist dringend empfohlen, dass wenn eine Anwendung Objekte zur späteren
   Verwendung in der Anwendung serialisiert, die Klassendefinitionen in
   der gesamten Anwendung eingebunden werden. Wird dies nicht beachtet, so
   wird das Objekt ohne eine Klassendefinition deserialisiert, was dazu
   führen wird, dass PHP dem Objekt eine Klasse
   <span class="classname"><strong class="classname">__PHP_Incomplete_Class_Name</strong></span> zuweisen wird, welche
   keine Methoden besitzt. Dies wird das Objekt nutzlos machen.
  </p>

  <p class="para">
   Wenn also im obigen Beispiel <var class="varname">$a</var> Teil einer Session würde,
   indem ein neuer Schlüssel zum superglobalen Array <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>
   hinzugefügt wird, dann sollte die Datei <code class="literal">A.php</code> in jeder
   Seite eingebunden werden, nicht nur in <var class="filename">page1.php</var> und
   <var class="filename">page2.php</var>.
  </p>

  <p class="para">
   Beachten Sie neben den obigen Hinweisen dass man sich in die Serialisierungs-
   und Deserialisierungs-Ereignisse einklinken kann, indem man die Methoden
   <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> und
   <a href="language.oop5.magic.php#object.wakeup" class="link">__wakeup()</a> eines Objektes verwendet.
   Die Verwendung von <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> erlaubt es
   nur eine Teilmenge der Eigenschaften eines Objektes zu serialisieren.
  </p>
 </div><?php manual_footer($setup); ?>