svn: /phpdoc/de/trunk/ language/namespaces.xml reference/session/functions/session-regenerate-id.xml reference/session/functions/session-set-save-handler.xml reference/session/functions/session-start.xml reference/session/ini.xml reference/strings/functions/addslashes.xml reference/strings/functions/parse-str.xml reference/strings/functions/stripos.xml reference/strings/functions/strpos.xml reference/strings/functions/strrpos.xml reference/tokenizer/functions/token-get-all.xml

[email protected] (Christoph Michael Becker)
Newsgroups php.doc.de
Message-ID <[email protected]>
cmb                                      Sat, 21 Apr 2018 21:23:55 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=344797

Log:
Sync with EN

Changed paths:
    U   phpdoc/de/trunk/language/namespaces.xml
    U   phpdoc/de/trunk/reference/session/functions/session-regenerate-id.xml
    U   phpdoc/de/trunk/reference/session/functions/session-set-save-handler.xml
    U   phpdoc/de/trunk/reference/session/functions/session-start.xml
    U   phpdoc/de/trunk/reference/session/ini.xml
    U   phpdoc/de/trunk/reference/strings/functions/addslashes.xml
    U   phpdoc/de/trunk/reference/strings/functions/parse-str.xml
    U   phpdoc/de/trunk/reference/strings/functions/stripos.xml
    U   phpdoc/de/trunk/reference/strings/functions/strpos.xml
    U   phpdoc/de/trunk/reference/strings/functions/strrpos.xml
    U   phpdoc/de/trunk/reference/tokenizer/functions/token-get-all.xml
svn-diffs-344797.txt (text/x-diff, 68 KB)
Modified: phpdoc/de/trunk/language/namespaces.xml
===================================================================
--- phpdoc/de/trunk/language/namespaces.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/language/namespaces.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 339351 Maintainer: simp Status: ready -->
+<!-- EN-Revision: 340397 Maintainer: simp Status: ready -->
+
 <chapter xml:id="language.namespaces" xmlns="http://docbook.org/ns/docbook"
 version="1.1">
  <title>Namespaces</title>
@@ -938,6 +939,15 @@
       </para>
      </listitem>
     </varlistentry>
+    <varlistentry>
+     <term>Relativer Name</term>
+     <listitem>
+      <para>
+       Dies ist ein Bezeicher, der mit <literal>namespace</literal> beginnt, wie
+       etwa <literal>namespace\Foo\Bar</literal>.
+      </para>
+     </listitem>
+    </varlistentry>
    </variablelist>
   </para>
   <para>
@@ -945,103 +955,81 @@
    <orderedlist>
     <listitem>
      <simpara>
-      Aufrufe von vollständig qualifizierten Funktionen, Klassen oder Konstanten
-      werden zur Kompilierungszeit aufgelöst. <literal>new \A\B</literal> wird
-      z.B. zur Klasse <literal>A\B</literal> aufgelöst.
+      Vollständig qualifizierte Namens werden immer zu dem Namen ohne führenden
+      Namensraumtrenner aufgelöst. <literal>\A\B</literal> wird
+      z.B. zu <literal>A\B</literal> aufgelöst.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
-      Alle unqualifizierten und qualifizierten Namen (nicht vollständig
-      qualifizierte Namen) werden gemäß den aktuellen Importen zur Kompilierungszeit
-      übersetzt. Wenn zum Beispiel der namespace <literal>A\B\C</literal> als
-      <literal>C</literal> importiert wurde, so wird ein Aufruf von
-      <literal>C\D\e()</literal> zu <literal>A\B\C\D\e()</literal> übersetzt.
+      Relative Namen werden immer zu dem Namen aufgelöst, in dem <literal>namespace</literal>
+      durch den aktuellen Namensraum ersetzt wurde. Taucht der Namen im globalen
+      Geltungsbereich auf, wird das <literal>namespace\</literal>-Präfix entfernt.
+      Beispielsweise wird <literal>namespace\A</literal> innerhalb des Namensraums
+      <literal>X\Y</literal> zu <literal>X\Y\A</literal> aufgelöst. Derselbe Name
+      im globalen Geltungsbereich wird zu <literal>A</literal> aufgelöst.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
-      Innerhalb eines Namespace wird allen qualifizierten Namen, die noch nicht
-      gemäß den Importregeln übersetzt wurden, der aktuelle Namespace vorangestellt.
-      Wenn z.B. <literal>C\D\e()</literal> innerhalb des Namespace <literal>A\B</literal>
-      aufgerufen wird, so wird dies zu <literal>A\B\C\D\e()</literal> übersetzt.
+      Für qualifizierte Namen wird das erste Segment des Namens gemäß der aktuellen
+      Klassen-/Namensraum-Importtabelle übersetzt. Wird beispielsweise der Namensraum
+      <literal>A\B\C</literal> als <literal>C</literal> importiert, wird der Name
+      <literal>C\D\E</literal> zu <literal>A\B\C\D\E</literal> übersetzt.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
-      Unqualifizierte Klassennamen werden zur Kompilierungszeit gemäß der aktuellen
-      Importregeln (vollständige Namen ersetzt durch kurze Aliasnamen) übersetzt.
-      Z.B. wenn der Namespace <literal>A\B\C</literal> als C importiert wurde,
-      so wird <literal>new C()</literal> zu <literal>new A\B\C()</literal>
-      übersetzt.
+      Wenn für qualifizierte Namen keine Importregel zutrifft, wird der aktuelle Namensraum
+      dem Namen vorangestellt. Beispielsweise wird der Name <literal>C\D\E</literal>
+      innerhalb des Namensraums <literal>A\B</literal> zu <literal>A\B\C\D\E</literal>
+      aufgelöst.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
-      Innerhalb eines Namespace (z.B. <literal>A\B</literal>) werden Aufrufe von
-      unqualifizierten Funktionen zur Laufzeit aufgelöst. Der Aufruf der Funktion
-      <literal>foo()</literal> wird wie folgt aufgelöst:
+      Für unqualifizierte Namen wird der Name gemäß der aktuellen Importtabelle für
+      die betreffende Symboltabelle übersetzt. Das bedeutet, dass klassenartige
+      Namen gemäß der Klassen-/Namensraum-Importtabelle, Funktionsnamen gemäß der
+      Funktions-Importtabelle und Konstantennamen gemäß der Konstanten-Importtabelle
+      übersetzt werden. Beispielsweise wird nach <literal>use A\B\C;</literal> eine
+      Verwendung wie etwa <literal>new C()</literal> zum Namen <literal>A\B\C()</literal>
+      aufgelöst. Analog wird nach <literal>use function A\B\fn;</literal> eine
+      Verwendung wie etwa <literal>fn()</literal> zum Namen <literal>A\B\fn</literal>
+      aufgelöst.
      </simpara>
-     <orderedlist>
-      <listitem>
-       <simpara>
-        Zuerst wird nach der Funktion im aktuellen Namespace gesucht:
-        <literal>A\B\foo()</literal>.
-       </simpara>
-      </listitem>
-      <listitem>
-       <simpara>
-        Es wird versucht, die Funktion <literal>foo()</literal> im
-        <emphasis>globalen</emphasis> Namensraum zu finden.
-       </simpara>
-      </listitem>
-     </orderedlist>
     </listitem>
     <listitem>
      <simpara>
-      Innerhalb eines Namespace (z.B. <literal>A\B</literal>) werden Aufrufe
-      von unqualifizierten oder qualifizierten Klassennamen (nicht vollständig
-      qualifizierte Klassennamen) zur Laufzeit aufgelöst. Der Aufruf von
-      <literal>new C()</literal> oder <literal>new D\E()</literal> wird
-      wir folgt aufgelöst.
-      Für <literal>new C()</literal>:
+      Wenn für unqualifizierte Namen keine Importregel zutrifft, und sich der Name
+      auf ein klassenartiges Symbol bezieht, wird der aktuelle Namensraum vorangestellt.
+      Beispielsweise wird <literal>new C()</literal> innerhalb des Namensraums
+      <literal>A\B</literal> zum Namen <literal>A\B\C</literal> aufgelöst.
      </simpara>
-     <orderedlist>
-      <listitem>
-       <simpara>
-        Zuerst wird nach der Klasse im aktuellen Namespace gesucht:
-        <literal>A\B\C</literal>.
-       </simpara>
-      </listitem>
-      <listitem>
-       <simpara>
-        Es wird versucht, die Klasse <literal>A\B\C</literal> mittels Autoload zu laden.
-       </simpara>
-      </listitem>
-     </orderedlist>
+    </listitem>
+    <listitem>
      <simpara>
-      Für <literal>new D\E()</literal>:
+      Wenn für unqualifizierte Namen keine Importregel zutrifft, und sich der Name
+      auf eine Funktion oder Konstante bezieht, und der Code sich außerhalb des
+      globalen Geltungsbereichs befindet, wird der Name zur Laufzeit aufgelöst.
+      Angenommen der Code befindet sich im Namensraum <literal>A\B</literal>, wird
+      im folgenden erläutert, wie der Aufruf einer Funktion <literal>foo()</literal>
+      aufgelöst wird:
      </simpara>
      <orderedlist>
       <listitem>
        <simpara>
-        Es wird nach der Klasse gesucht, indem der aktuelle Namespace
-        vorangestellt wird:
-        <literal>A\B\D\E</literal>.
+        Zuerst wird nach der Funktion im aktuellen Namespace gesucht:
+        <literal>A\B\foo()</literal>.
        </simpara>
       </listitem>
       <listitem>
        <simpara>
-        Es wird versucht, die Klasse <literal>A\B\D\E</literal> mittels
-        Autoload zu laden.
+        Es wird versucht, die Funktion <literal>foo()</literal> im
+        <emphasis>globalen</emphasis> Namensraum zu finden und aufzurufen.
        </simpara>
       </listitem>
      </orderedlist>
-     <simpara>
-      Um auf eine globale Klasse im globalen Namespace zuzugreifen,
-      muss deren vollständig qualifizierter Name <literal>new \C()</literal>
-      verwendet werden.
-     </simpara>
     </listitem>
    </orderedlist>
   </para>

Modified: phpdoc/de/trunk/reference/session/functions/session-regenerate-id.xml
===================================================================
--- phpdoc/de/trunk/reference/session/functions/session-regenerate-id.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/session/functions/session-regenerate-id.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 332711 Maintainer: samesch Status: ready -->
+<!-- EN-Revision: 343899 Maintainer: samesch Status: ready -->
+
 <refentry xml:id="function.session-regenerate-id" xmlns="http://docbook.org/ns/docbook">
  <refnamediv>
   <refname>session_regenerate_id</refname>
@@ -11,7 +12,7 @@
   &reftitle.description;
   <methodsynopsis>
    <type>bool</type><methodname>session_regenerate_id</methodname>
-   <methodparam choice="opt"><type>bool</type><parameter>delete_old_session</parameter><initializer>false</initializer></methodparam>
+   <methodparam choice="opt"><type>bool</type><parameter>delete_old_session</parameter><initializer>&false;</initializer></methodparam>
   </methodsynopsis>
   <para>
    Die Funktion <function>session_regenerate_id</function> ersetzt die
@@ -24,6 +25,23 @@
    <function>session_regenerate_id</function> beginnen. Andernfalls wird die
    alte Session-ID verwendet.
   </para>
+  <warning>
+   <para>
+    Zurzeit kann session_regenerate_id nicht gut mit unstabilen Netzwerken umgehen,
+    wie z.B. mobilen und WiFi-Netzwerken. Daher kann es zu verlorenen Sessions
+    kommen, wenn session_regenarate_id aufgerufen wird.
+   </para>
+   <para>
+    Die alten Session-Daten sollten nicht sofort zerstört werden, sondern es sollte
+    ein Destroy-Zeitstempel verwendet werden, und der Zugriff auf die alte Session-ID
+    sollte kontrolliert werden. Andernfalls kann der konkurrierende Zugriff auf
+    die Seite möglicherweise zu einem inkonsistenten Zustand führen, oder die
+    Session kann gänzlich verloren werden, oder es kann sich eine Race Condition
+    im Client (Browser) ergeben, und viele Session-IDs könnten nutzlos erzeugt
+    werden. Die sofotige Löschung der Session-Daten verhindert die Erkennung von
+    Session-Hijack-Angriffen, und ebenfalls deren Vorbeugung.
+   </para>
+  </warning>
  </refsect1>

  <refsect1 role="parameters">
@@ -36,6 +54,9 @@
        <para>
         Legt fest, ob die zugehörige alte Sessiondatei gelöscht werden soll
         oder nicht.
+        Die alten Session-Daten sollten nicht gelöscht werden, wenn Race Conditions,
+        die durch die Löschung verursacht werden, verhindert, oder
+        Session-Hijack-Angriffe erkannt oder vermieden werden müssen.
        </para>
       </listitem>
      </varlistentry>
@@ -63,11 +84,10 @@
      </thead>
      <tbody>
       <row>
-       <entry>4.3.3</entry>
+       <entry>7.0.0</entry>
        <entry>
-        Falls Session-Cookies aktiviert sind, wird durch die Verwendung von
-        <function>session_regenerate_id</function> nun auch ein neues
-        Session-Cookie mit der neuen Session-ID abgegeben.
+        <function>session_regenerate_id</function> speichert die alten Session-Daten
+        bevor die Session geschlossen wird.
        </entry>
       </row>
       <row>
@@ -76,6 +96,14 @@
         Den Parameter <parameter>delete_old_session</parameter> hinzugefügt
        </entry>
       </row>
+      <row>
+       <entry>4.3.3</entry>
+       <entry>
+        Falls Session-Cookies aktiviert sind, wird durch die Verwendung von
+        <function>session_regenerate_id</function> nun auch ein neues
+        Session-Cookie mit der neuen Session-ID abgegeben.
+       </entry>
+      </row>
      </tbody>
     </tgroup>
    </informaltable>
@@ -90,17 +118,37 @@
     <programlisting role="php">
 <![CDATA[
 <?php
+// ACHTUNG: dieser Code ist nicht voll funktionsfähig, sondern dient nur als Beispiel!
+
 session_start();

-$alte_sessionid = session_id();
+// Prüfe den Destroy-Zeitstempel
+if (isset($_SESSION['destroyed'])
+    && $_SESSION['destroyed'] < time() - 300) {
+    // Dies sollte normalerweise nicht passieren. Es könnte durch einen Angriff
+    // oder ein unstabiles Netzwerk verursacht worden sein.
+    // Entferne den Authentifizierungsstatus dieser Nutzer-Session.
+    remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
+    throw(new DestroyedSessionAccessException);
+}

+$old_sessionid = session_id();
+
+// Lege den Destroy-Zeitstempel fest
+$_SESSION['destroyed'] = time(); // Von PHP 7.0.0 an speichert session_regenerate_id() die alten Session-Daten
+
+// Der einfache Aufruf von session_regenerate_id() kann in einer verlorenen
+// Session resultieren, etc. Siehe das nächste Beispiel.
 session_regenerate_id();

-$neue_sessionid = session_id();
+// Die neue Session braucht keinen Destroy-Zeitstempel
+unset($_SESSION['destroyed']);

-echo "Alte Session: $alte_sessionid<br>";
-echo "Neue Session: $neue_sessionid<br>";
+$new_sessionid = session_id();

+echo "Alte Session: $old_sessionid<br />";
+echo "Neue Session: $new_sessionid<br />";
+
 print_r($_SESSION);
 ?>
 ]]>
@@ -107,6 +155,76 @@
     </programlisting>
    </example>
   </para>
+
+  <para>
+   Zurzeit kann das Session-Modul nicht gut mit unstabilen Netzwerken umgehen.
+   Die Session-ID sollte selbst verwaltet werden, um verlorene Sessions durch
+   session_regenarate_id zu verhindern.
+  </para>
+
+  <para>
+   <example>
+    <title>Verhindern von verlorenen Sessions durch <function>session_regenerate_id</function></title>
+    <programlisting role="php">
+<![CDATA[
+<?php
+// ACHTUNG: dieser Code ist nicht voll funktionsfähig, sondern dient nur als Beispiel!
+// my_session_start() und my_session_regenerate_id() verhindern verlorene Session
+// durch unstabile Netzwerke. Zusätzlich kann dieser Code dem Ausnutzen einer
+// gestohlenen Session durch Angreifer vorbeugen.
+
+function my_session_start() {
+    session_start();
+    if (isset($_SESSION['destroyed'])) {
+       if ($_SESSION['destroyed'] < time()-300) {
+           // Dies sollte normalerweise nicht passieren. Es könnte durch einen Angriff
+           // oder ein unstabiles Netzwerk verursacht worden sein.
+           // Entferne den Authentifizierungsstatus dieser Nutzer-Session.
+           remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
+           throw(new DestroyedSessionAccessException);
+       }
+       if (isset($_SESSION['new_session_id'])) {
+           // Noch nicht vollständig abgelaufen. Könnte an einem verlorenen Cookie durch ein unstabiles Netzwerk liegen.
+           // Noch einmal versuchen das ordnungsgemäße Session-ID-Cookie zu setzen.
+           // ACHTUNG: es sollte nicht versucht werden, die Session-ID erneut festzulegen,
+           // wenn das Authentifizierungsflag entfernt werden soll.
+           session_commit();
+           session_id($_SESSION['new_session_id']);
+           // Die neue Session-ID sollte existieren
+           session_start();
+           return;
+       }
+   }
+}
+
+function my_session_regenerate_id() {
+    // Eine neue Session-ID wird benötigt, um die richtige Session-ID festzulegen,
+    // wenn die Session-ID aufgrund eines unstabilen Netzwerks nicht gesetzt wurde.
+    $new_session_id = session_create_id();
+    $_SESSION['new_session_id'] = $new_session_id;
+
+    // Lege den Destroy-Zeitstempel fest
+    $_SESSION['destroyed'] = time();
+
+    // Schreibe und schließe die aktuelle Session
+    session_commit();
+
+    // Starte die Session mit einer neuen Session-ID
+    session_id($new_session_id);
+    ini_set('session.use_strict_mode', 0);
+    session_start();
+    ini_set('session.use_strict_mode', 1);
+
+    // Die neue Session braucht sie nicht
+    unset($_SESSION['destroyed']);
+    unset($_SESSION['new_session_id']);
+}
+?>
+]]>
+    </programlisting>
+   </example>
+  </para>
+
  </refsect1>

  <refsect1 role="seealso">
@@ -114,7 +232,10 @@
   <para>
    <simplelist>
     <member><function>session_id</function></member>
+    <member><function>session_create_id</function></member>
     <member><function>session_start</function></member>
+    <member><function>session_destroy</function></member>
+    <member><function>session_reset</function></member>
     <member><function>session_name</function></member>
    </simplelist>
   </para>

Modified: phpdoc/de/trunk/reference/session/functions/session-set-save-handler.xml
===================================================================
--- phpdoc/de/trunk/reference/session/functions/session-set-save-handler.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/session/functions/session-set-save-handler.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 323466 Maintainer: samesch Status: ready -->
+<!-- EN-Revision: 344795 Maintainer: samesch Status: ready -->

-<refentry xml:id="function.session-set-save-handler" xmlns="http://docbook.org/ns/docbook">
+<refentry xml:id="function.session-set-save-handler" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
  <refnamediv>
   <refname>session_set_save_handler</refname>
   <refpurpose>Setzt benutzerdefinierte Session-Speicherfunktionen</refpurpose>
@@ -12,12 +12,15 @@
   &reftitle.description;
   <methodsynopsis>
    <type>bool</type><methodname>session_set_save_handler</methodname>
-   <methodparam><type>callback</type><parameter>open</parameter></methodparam>
-   <methodparam><type>callback</type><parameter>close</parameter></methodparam>
-   <methodparam><type>callback</type><parameter>read</parameter></methodparam>
-   <methodparam><type>callback</type><parameter>write</parameter></methodparam>
-   <methodparam><type>callback</type><parameter>destroy</parameter></methodparam>
-   <methodparam><type>callback</type><parameter>gc</parameter></methodparam>
+   <methodparam><type>callable</type><parameter>open</parameter></methodparam>
+   <methodparam><type>callable</type><parameter>close</parameter></methodparam>
+   <methodparam><type>callable</type><parameter>read</parameter></methodparam>
+   <methodparam><type>callable</type><parameter>write</parameter></methodparam>
+   <methodparam><type>callable</type><parameter>destroy</parameter></methodparam>
+   <methodparam><type>callable</type><parameter>gc</parameter></methodparam>
+   <methodparam choice="opt"><type>callable</type><parameter>create_sid</parameter></methodparam>
+   <methodparam choice="opt"><type>callable</type><parameter>validate_sid</parameter></methodparam>
+   <methodparam choice="opt"><type>callable</type><parameter>update_timestamp</parameter></methodparam>
   </methodsynopsis>
   <para>
    Seit PHP 5.4 ist es möglich folgenden Prototypen zu registrieren:
@@ -24,8 +27,8 @@
   </para>
   <methodsynopsis>
    <type>bool</type><methodname>session_set_save_handler</methodname>
-   <methodparam><type>SessionHandlerInterface</type><parameter>sessionhandler</parameter></methodparam>
-   <methodparam choice="opt"><type>bool</type><parameter>register_shutdown</parameter><initializer>true</initializer></methodparam>
+   <methodparam><type>object</type><parameter>sessionhandler</parameter></methodparam>
+   <methodparam choice="opt"><type>bool</type><parameter>register_shutdown</parameter><initializer>&true;</initializer></methodparam>
   </methodsynopsis>
   <para>
    <function>session_set_save_handler</function> setzt die benutzerdefinierten
@@ -46,7 +49,9 @@
      <term><parameter>sessionhandler</parameter></term>
      <listitem>
       <para>
-       Ein Exemplar einer Klasse die <interfacename>SessionHandlerInterface</interfacename>
+       Ein Exemplar einer Klasse, die <interfacename>SessionHandlerInterface</interfacename>,
+       <interfacename>SessionIdInterface</interfacename> und/oder
+       <interfacename>SessionUpdateTimestampHandlerInterface</interfacename>
        implementiert, wie beispielsweise <classname>SessionHandler</classname>, das als
        benutzerdefinierte Session-Speicherfunktion registriert werden soll.
        Erst seit PHP 5.4.
@@ -57,7 +62,7 @@
      <term><parameter>register_shutdown</parameter></term>
      <listitem>
       <para>
-       Registriert <function>session_register_shutdown</function> als eine
+       Registriert <function>session_write_close</function> als eine
        <function>register_shutdown_function</function> Funktion.
       </para>
      </listitem>
@@ -184,6 +189,16 @@
       </para>
      </listitem>
     </varlistentry>
+    <varlistentry>
+     <term><parameter>create_sid()</parameter></term>
+     <listitem>
+      <para>
+       Dieser Callback wird ausgeführt, wenn eine neue Session-ID benötigt wird.
+       Es werden keine Parameter übergeben, und der Rückgabewert sollte eine
+       Zeichenkette sein, die eine gültige Session-ID für den Handler darstellt.
+      </para>
+     </listitem>
+    </varlistentry>
    </variablelist>
   </para>
  </refsect1>
@@ -199,146 +214,123 @@
   &reftitle.examples;
   <para>
    <example>
-    <title><function>session_set_save_handler</function> Beispiel</title>
+    <title>
+     Benutzerdefierter Session-Handler; der vollständige Code ist bei <classname>SessionHandlerInterface</classname> aufgeführt
+    </title>
     <para>
-     Das folgende Beispiel liefert eine dateibasierte Session-Speicherung, die
-     der Standard-Speicherroutine <parameter>files</parameter> der
-     PHP-Sessions ähnlich ist. Dieses Beispiel kann problemlos erweitert
-     werden, dass es Datenbank-Speicherung mittels ihrer bevorzugten
-     PHP-gestützten Datenbank beinhaltet.
+     Der folgende Code ist für PHP-Version 5.4.0 und höher. Hier wird nur der
+     Aufruf gezeigt; der vollständige Beispielcode ist in der Dokumentation von
+     <classname>SessionHandlerInterface</classname> zu finden.
     </para>
+    <para>
+     Es ist zu beachten, dass der OOP-Prototyp mit <function>session_set_save_handler</function>
+     verwendet wird, und dass die Shutdown-Funktion unter Verwendung des Parameters
+     flag der Funktion registriert wird. Dies wird grundsätzlich empfohlen, wenn
+     Objekte als Session-Save-Handler registriert werden.
+    </para>
     <programlisting role="php">
 <![CDATA[
 <?php
-function oeffne($speicherpfad, $session_name)
+class MySessionHandler implements SessionHandlerInterface
 {
-  global $sess_speicherpfad;
-
-  $sess_speicherpfad = $speicherpfad;
-  return(true);
+    // hier wird das Interface implementiert
 }

-function schliesse()
-{
-  return(true);
-}
-
-function lese($id)
-{
-  global $sess_speicherpfad;
-
-  $sess_datei = "$sess_speicherpfad/sess_$id";
-  return (string) @file_get_contents($sess_datei);
-}
-
-function schreibe($id, $sess_daten)
-{
-  global $sess_speicherpfad;
-
-  $sess_datei = "$sess_speicherpfad/sess_$id";
-  if ($fp = @fopen($sess_datei, "w")) {
-    $return = fwrite($fp, $sess_daten);
-    fclose($fp);
-    return $return;
-  } else {
-    return(false);
-  }
-}
-
-function loesche($id)
-{
-  global $sess_speicherpfad;
-
-  $sess_datei = "$sess_speicherpfad/sess_$id";
-  return(@unlink($sess_datei));
-}
-
-function gc($maxlifetime)
-{
-  global $sess_speicherpfad;
-
-  foreach (glob("$sess_speicherpfad/sess_*") as $dateiname) {
-    if (filemtime($dateiname) + $maxlifetime < time()) {
-      @unlink($dateiname);
-    }
-  }
-  return true;
-}
-
-session_set_save_handler("oeffne", "schliesse", "lese", "schreibe", "loesche", "gc");
-
+$handler = new MySessionHandler();
+session_set_save_handler($handler, true);
 session_start();

-// verfahren Sie mit Sessions wie gewohnt
-?>
+// fahre fort und setze und hole Werte per Schlüssel von $_SESSION
 ]]>
     </programlisting>
    </example>
    <example>
-    <title>
-     <function>session_set_save_handler</function> mit Verwendung von
-     <classname>SessionHandler</classname>
-    </title>
+    <title>Benutzerdefinierter Session-Save-Handler, der Objekte verwendet</title>
+    <para>
+     Der folgende Code ist für PHP-Versionen kleiner als 5.4.0.
+    </para>
+    <para>
+     Das folgende Beispiel liefert eine dateibasierte Session-Speicherung, die
+     der Standard-Speicherroutine <parameter>files</parameter> der
+     PHP-Sessions ähnlich ist. Dieses Beispiel kann problemlos erweitert
+     werden, dass es Datenbank-Speicherung mittels ihrer bevorzugten
+     PHP-gestützten Datenbank beinhaltet.
+    </para>
+    <para>
+     Es ist zu beachten, dass zusätzlich die Shutdown-Funktion
+     <function>session_write_close</function> unter Verwendung von
+     <function>register_shutdown_function</function> unter PHP kleiner 5.4.0
+     registriert wird. Dies wird grundsätzlich empfohlen, wenn Objekte als
+     Session-Save-Handler unter PHP kleiner 5.4.0 registriert werden.
+    </para>
     <programlisting role="php">
 <![CDATA[
-<?php
-class MySessionHandler extends SessionHandler {
-  public function open($save_path, $sessionid)
-  {
-    global $sess_save_path;
+class FileSessionHandler
+{
+    private $savePath;

-    $sess_save_path = $save_path;
-    return(true);
-  }
-  public function close()
-  {
-    return true;
-  }
-  public function read($sessionid)
-  {
-    global $sess_save_path;
+    function open($savePath, $sessionName)
+    {
+        $this->savePath = $savePath;
+        if (!is_dir($this->savePath)) {
+            mkdir($this->savePath, 0777);
+        }

-    $sess_file = "$sess_save_path/sess_$id";
-    return (string) @file_get_contents($sess_file);
-  }
-  public function write($sessionid, $sessiondata)
-  {
-    global $sess_save_path;
+        return true;
+    }

-    $sess_file = "$sess_save_path/sess_$id";
-    if ($fp = @fopen($sess_file, "w")) {
-      $return = fwrite($fp, $sess_data);
-      fclose($fp);
-      return $return;
-    } else {
-      return(false);
+    function close()
+    {
+        return true;
     }
-  }
-  public function destroy($sessionid)
-  {
-    global $sess_save_path;

-    $sess_file = "$sess_save_path/sess_$id";
-    return(@unlink($sess_file));
-  }
-  public function gc($maxlifetime)
-  {
-    global $sess_save_path;
+    function read($id)
+    {
+        return (string)@file_get_contents("$this->savePath/sess_$id");
+    }

-    foreach (glob("$sess_save_path/sess_*") as $filename) {
-      if (filemtime($filename) + $maxlifetime < time()) {
-        @unlink($filename);
-      }
+    function write($id, $data)
+    {
+        return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
     }
-    return true;
-  }
+
+    function destroy($id)
+    {
+        $file = "$this->savePath/sess_$id";
+        if (file_exists($file)) {
+            unlink($file);
+        }
+
+        return true;
+    }
+
+    function gc($maxlifetime)
+    {
+        foreach (glob("$this->savePath/sess_*") as $file) {
+            if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
+                unlink($file);
+            }
+        }
+
+        return true;
+    }
 }

-$handler = new MySessionHandler();
-session_set_save_handler($handler);
+$handler = new FileSessionHandler();
+session_set_save_handler(
+    array($handler, 'open'),
+    array($handler, 'close'),
+    array($handler, 'read'),
+    array($handler, 'write'),
+    array($handler, 'destroy'),
+    array($handler, 'gc')
+    );

+// das folgende verhindert unerwartete Effekte, wenn Objekte als Save-Handler verwendet werden
+register_shutdown_function('session_write_close');
+
 session_start();
-?>
+// fahre fort Werte per Schlüssel in $_SESSION zu setzen und zu holen
 ]]>
     </programlisting>
    </example>
@@ -349,15 +341,36 @@
   &reftitle.notes;
   <warning>
    <para>
+    Werden Objekte als Session-Save-Handler verwendet, ist es wichtig die
+    Shutdown-Funktion mit PHP zu registrieren, um unerwartete Nebenwirkungen in
+    Verbindung mit der Art wie PHP intern Objekte beim Herunterfahren zerstört
+    zu verhindern, was dazu führen kann, dass <parameter>write</parameter> und
+    <parameter>close</parameter> nicht aufgerufen werden. Üblicherweise sollte
+    <parameter>'session_write_close'</parameter> unter Verwendung von
+    <function>register_shutdown_function</function> registriert werden.
+   </para>
+   <para>
+    Von PHP 5.4.0 an kann <function>session_register_shutdown</function> verwendet
+    werden, oder einfach das 'register shutdown' Flag gesetzt werden, wenn
+    <function>session_set_save_handler</function> unter Verwendung der OOP-Methode
+    und der Übergabe eines Exemplars, das <classname>SessionHandlerInterface</classname>
+    implementiert, aufgerufen wird.
+   </para>
+  </warning>
+  <warning>
+   <para>
     Ab PHP 5.0.5 werden die Routinen <parameter>write</parameter> und
     <parameter>close</parameter> nach dem Zerstören von Objekten
     aufgerufen und können deshalb keine Objekte verwenden oder Exceptions
-    (Fehler-, Ausnahmesituationen) auslösen. Objekt-Destruktoren können
+    (Fehler-, Ausnahmesituationen) auslösen. Exceptions können nicht abgefangen
+    werden, und es wird auch kein Exception-Trace angezeigt; die Ausführung wird
+    einfach unerwartet abgebrochen. Objekt-Destruktoren können
     aber Sessions verwenden.
    </para>
    <para>
     Es ist möglich, <function>session_write_close</function> über den
-    Destruktor aufzurufen, um dieses Henne-Ei Problem zu lösen.
+    Destruktor aufzurufen, um dieses Henne-Ei Problem zu lösen, aber der verlässlichste
+    Weg ist das Registrieren einer Shutdown-Funktion wie oben beschrieben.
    </para>
   </warning>
   <warning>
@@ -382,11 +395,25 @@
     </thead>
     <tbody>
      <row>
+      <entry>7.0.0</entry>
+      <entry>
+       Die optionalen Parameter <parameter>validate_sid</parameter> und
+       <parameter>update_timestamp</parameter> wurden hinzugefügt.
+      </entry>
+     </row>
+     <row>
+      <entry>5.5.1</entry>
+      <entry>
+       Der optionale Parameter <parameter>create_sid</parameter> wurde hinzugefügt.
+      </entry>
+     </row>
+     <row>
       <entry>5.4.0</entry>
       <entry>
-       <interfacename>SessionHandlerInterface</interfacename> und
-       <classname>SessionHandler</classname> zum Implementieren von
-       benutzerdefinierten Session-Speicherfunktionen hinzugefügt.
+       <interfacename>SessionHandlerInterface</interfacename> zum Implementieren
+       von Session-Handlern und
+       <classname>SessionHandler</classname>, um interne PHP Session-Handler
+       bereitzustellen, hinzugefügt.
       </entry>
      </row>
     </tbody>
@@ -402,6 +429,17 @@
      Die <link linkend="ini.session.save-handler">session.save_handler</link>
      Konfigurationsanweisung
     </member>
+    <member>
+     Die <link linkend="ini.session.serialize-handler">session.serialize_handler</link>
+     Konfigurationsdirektive
+    </member>
+    <member><function>register_shutdown_function</function></member>
+    <member><function>session_register_shutdown</function> (von PHP 5.4.0 an)</member>
+    <member>
+     Eine vollständige prozedurale Referenzimplementierung kann
+     <link xlink:href="&url.session-save-handler;">save_handler.inc</link>
+     entnommen werden
+    </member>
    </simplelist>
   </para>
  </refsect1>

Modified: phpdoc/de/trunk/reference/session/functions/session-start.xml
===================================================================
--- phpdoc/de/trunk/reference/session/functions/session-start.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/session/functions/session-start.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 323403 Maintainer: samesch Status: ready -->
+<!-- EN-Revision: 344212 Maintainer: samesch Status: ready -->
+
 <refentry xml:id="function.session-start" xmlns="http://docbook.org/ns/docbook">
  <refnamediv>
   <refname>session_start</refname>
@@ -11,7 +12,7 @@
   &reftitle.description;
   <methodsynopsis>
    <type>bool</type><methodname>session_start</methodname>
-   <methodparam choice="opt"><type>array</type><parameter>options</parameter><initializer>[]</initializer></methodparam>
+   <methodparam choice="opt"><type>array</type><parameter>options</parameter><initializer>array()</initializer></methodparam>
   </methodsynopsis>
   <para>
    <function>session_start</function> erzeugt eine Session oder nimmt die
@@ -58,14 +59,13 @@
       Als optionaler Parameter kann ein assoziatives Array mit Optionen
       angegeben werden, das die aktuell gesetzten
       <link linkend="session.configuration">Sessionkonfigurationsdirektiven</link>
-      überschreibt. Die Schlüssel sollten nicht die <literal>session.</literal>-Präfixe
+      übersteuert. Die Schlüssel sollten nicht das <literal>session.</literal>-Präfix
       beinhalten.
      </para>
      <para>
       Zusätzlich zu den normalen Konfigurationsdirektiven kann auch eine
-      In addition to the normal set of configuration directives, a
       <literal>read_and_close</literal>-Option angegeben werden. Falls auf
-      &true; gesetzt, führt es dazu, dass die Session unmittelbar nach dem
+      &true; gesetzt, führt sie dazu, dass die Session unmittelbar nach dem
       Auslesen geschlossen wird. Dadurch lässt sich eine unnötige Sperre
       vermeiden, wenn die Sessiondaten nicht verändert werden.
      </para>
@@ -95,6 +95,13 @@
      </thead>
      <tbody>
       <row>
+       <entry>7.1.0</entry>
+       <entry>
+        <function>session_start</function> gibt nun &false; zurück, und initialisiert
+        <varname>$_SESSION</varname> nicht mehr, wenn das Starten der Session fehlschlug.
+       </entry>
+      </row>
+      <row>
        <entry>7.0.0</entry>
        <entry>
         Der Parameter <parameter>options</parameter> wurde hinzugefügt.
@@ -125,12 +132,13 @@

  <refsect1 role="examples">
   &reftitle.examples;
-  <para>
-   <example>
-    <title>
-     Ein Session-Beispiel: <filename>seite1.php</filename>
-    </title>
-    <programlisting role="php">
+  <refsect2>
+   <title>Ein grundlegendes Session-Beispiel</title>
+
+   <para>
+    <example>
+     <title><filename>seite1.php</filename></title>
+     <programlisting role="php">
 <![CDATA[
 <?php
 // seite1.php
@@ -150,21 +158,21 @@
 echo '<br /><a href="seite2.php?' . SID . '">Seite 2</a>';
 ?>
 ]]>
-    </programlisting>
-   </example>
-  </para>
-  <para>
-   Nach dem Aufruf von <filename>seite1.php</filename> enthält automatisch
-   auch die zweite Seite, <filename>seite2.php</filename>, die Session-Daten.
-   Lesen Sie <link linkend="ref.session">Session Funktionen</link>, um weitere
-   Informationen über die <link linkend="session.idpassing">Übermittlung der
-   Session-ID</link> zu erhalten. Dort wird zum Beispiel erklärt, worum es
-   sich bei der Konstanten <constant>SID</constant> handelt.
-  </para>
-  <para>
-   <example>
-    <title>Ein Session-Beispiel: <filename>seite2.php</filename></title>
-    <programlisting role="php">
+     </programlisting>
+    </example>
+   </para>
+   <para>
+    Nach dem Aufruf von <filename>seite1.php</filename> enthält automatisch
+    auch die zweite Seite, <filename>seite2.php</filename>, die Session-Daten.
+    Lesen Sie <link linkend="ref.session">Session Funktionen</link>, um weitere
+    Informationen über die <link linkend="session.idpassing">Übermittlung der
+    Session-ID</link> zu erhalten. Dort wird zum Beispiel erklärt, worum es
+    sich bei der Konstanten <constant>SID</constant> handelt.
+   </para>
+   <para>
+    <example>
+     <title><filename>seite2.php</filename></title>
+     <programlisting role="php">
 <![CDATA[
 <?php
 // seite2.php
@@ -181,15 +189,15 @@
 echo '<br /><a href="seite1.php">Seite 1</a>';
 ?>
 ]]>
-    </programlisting>
-   </example>
-  </para>
-
+     </programlisting>
+    </example>
+   </para>
+  </refsect2>
   <refsect2>
    <title>Optionen an <function>session_start</function> übergeben</title>

    <example>
-    <title>Die Cookie-Gültigkeitsdauer überschreiben</title>
+    <title>Die Cookie-Gültigkeitsdauer übersteuern</title>
     <programlisting role="php">
 <![CDATA[
 <?php
@@ -209,7 +217,7 @@
 <?php
 // Sofern wir wissen, dass wir keine Daten zu verändern brauchen,
 // können wir die Session unmittelbar nach dem Auslesen automatisch
-// schließen, um eine Sperre für die Session zu vermeiden und andere
+// schließen, um eine Sperre für die Session zu vermeiden und
 // andere Seiten während der Zeit am Zugriff nicht zu behindern.
 session_start([
     'cookie_lifetime' => 86400,

Modified: phpdoc/de/trunk/reference/session/ini.xml
===================================================================
--- phpdoc/de/trunk/reference/session/ini.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/session/ini.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 339963 Maintainer: samesch Status: ready -->
+<!-- EN-Revision: 344792 Maintainer: samesch Status: ready -->
+
 <section xml:id="session.configuration" xmlns="http://docbook.org/ns/docbook">
  &reftitle.runtime;
  &extension.runtime;
@@ -51,7 +52,7 @@
       <entry><link linkend="ini.session.gc-divisor">session.gc_divisor</link></entry>
       <entry>"100"</entry>
       <entry>PHP_INI_ALL</entry>
-      <entry>Seit PHP 4.3.2 verfügbar.</entry>
+      <entry></entry>
      </row>
      <row>
       <entry><link linkend="ini.session.gc-maxlifetime">session.gc_maxlifetime</link></entry>
@@ -87,7 +88,7 @@
       <entry><link linkend="ini.session.cookie-secure">session.cookie_secure</link></entry>
       <entry>""</entry>
       <entry>PHP_INI_ALL</entry>
-      <entry>Seit PHP 4.0.4 verfügbar.</entry>
+      <entry></entry>
      </row>
      <row>
       <entry><link linkend="ini.session.cookie-httponly">session.cookie_httponly</link></entry>
@@ -111,7 +112,7 @@
       <entry><link linkend="ini.session.use-only-cookies">session.use_only_cookies</link></entry>
       <entry>"1"</entry>
       <entry>PHP_INI_ALL</entry>
-      <entry>Seit PHP 4.3.0 verfügbar.</entry>
+      <entry></entry>
      </row>
      <row>
       <entry><link linkend="ini.session.referer-check">session.referer_check</link></entry>
@@ -120,18 +121,6 @@
       <entry></entry>
      </row>
      <row>
-      <entry><link linkend="ini.session.entropy-file">session.entropy_file</link></entry>
-      <entry>""</entry>
-      <entry>PHP_INI_ALL</entry>
-      <entry>Entfernt in PHP 7.1.0.</entry>
-     </row>
-     <row>
-      <entry><link linkend="ini.session.entropy-length">session.entropy_length</link></entry>
-      <entry>"0"</entry>
-      <entry>PHP_INI_ALL</entry>
-      <entry>Entfernt in PHP 7.1.0.</entry>
-     </row>
-     <row>
       <entry><link linkend="ini.session.cache-limiter">session.cache_limiter</link></entry>
       <entry>"nocache"</entry>
       <entry>PHP_INI_ALL</entry>
@@ -147,10 +136,7 @@
       <entry><link linkend="ini.session.use-trans-sid">session.use_trans_sid</link></entry>
       <entry>"0"</entry>
       <entry>PHP_INI_ALL</entry>
-      <entry>
-       PHP_INI_ALL in PHP &lt;= 4.2.3. PHP_INI_PERDIR in PHP &lt; 5. Seit PHP
-       4.0.3 verfügbar.
-      </entry>
+      <entry></entry>
      </row>
      <row>
       <entry><link linkend="ini.session.trans-sid-tags">session.trans_sid_tags</link></entry>
@@ -165,24 +151,6 @@
       <entry>Verfügbar seit PHP 7.1.0.</entry>
      </row>
      <row>
-      <entry><link linkend="ini.url-rewriter.tags">url_rewriter.tags</link></entry>
-      <entry>"a=href,area=href,frame=src,form="</entry>
-      <entry>PHP_INI_ALL</entry>
-      <entry>Verfügbar seit PHP 4.0.4. Ab PHP 7.1.0 wird diese INI Einstellung nicht länger für die Session verwendet.</entry>
-     </row>
-     <row>
-      <entry><link linkend="ini.session.bug-compat-42">session.bug_compat_42</link></entry>
-      <entry>"1"</entry>
-      <entry>PHP_INI_ALL</entry>
-      <entry>Seit PHP 4.3.0 verfügbar. Entfernt in PHP 5.4.0.</entry>
-     </row>
-     <row>
-      <entry><link linkend="ini.session.bug-compat-warn">session.bug_compat_warn</link></entry>
-      <entry>"1"</entry>
-      <entry>PHP_INI_ALL</entry>
-      <entry>Seit PHP 4.3.0 verfügbar. Entfernt in PHP 5.4.0.</entry>
-     </row>
-     <row>
       <entry><link linkend="ini.session.sid-length">session.sid_length</link></entry>
       <entry>"32"</entry>
       <entry>PHP_INI_ALL</entry>
@@ -195,18 +163,6 @@
       <entry>Verfügbar seit PHP 7.1.0.</entry>
      </row>
      <row>
-      <entry><link linkend="ini.session.hash-function">session.hash_function</link></entry>
-      <entry>"0"</entry>
-      <entry>PHP_INI_ALL</entry>
-      <entry>Seit PHP 5.0.0 verfügbar. Entfernt in PHP 7.1.0.</entry>
-     </row>
-     <row>
-      <entry><link linkend="ini.session.hash-bits-per-character">session.hash_bits_per_character</link></entry>
-      <entry>"4"</entry>
-      <entry>PHP_INI_ALL</entry>
-      <entry>Seit PHP 5.0.0 verfügbar. Entfernt in PHP 7.1.0.</entry>
-     </row>
-     <row>
       <entry><link linkend="ini.session.upload-progress.enabled">session.upload_progress.enabled</link></entry>
       <entry>"1"</entry>
       <entry>PHP_INI_PERDIR</entry>
@@ -248,6 +204,48 @@
       <entry>PHP_INI_ALL</entry>
       <entry>Seit PHP 7.0.0 verfügbar.</entry>
      </row>
+     <row>
+      <entry><link linkend="ini.url-rewriter.tags">url_rewriter.tags</link></entry>
+      <entry>"a=href,area=href,frame=src,form="</entry>
+      <entry>PHP_INI_ALL</entry>
+      <entry>Ab PHP 7.1.0 wird diese INI Einstellung nicht länger für die Session verwendet.</entry>
+     </row>
+     <row>
+      <entry><link linkend="ini.session.hash-function">session.hash_function</link></entry>
+      <entry>"0"</entry>
+      <entry>PHP_INI_ALL</entry>
+      <entry>Entfernt in PHP 7.1.0.</entry>
+     </row>
+     <row>
+      <entry><link linkend="ini.session.hash-bits-per-character">session.hash_bits_per_character</link></entry>
+      <entry>"4"</entry>
+      <entry>PHP_INI_ALL</entry>
+      <entry>Entfernt in PHP 7.1.0.</entry>
+     </row>
+     <row>
+      <entry><link linkend="ini.session.entropy-file">session.entropy_file</link></entry>
+      <entry>""</entry>
+      <entry>PHP_INI_ALL</entry>
+      <entry>Entfernt in PHP 7.1.0.</entry>
+     </row>
+     <row>
+      <entry><link linkend="ini.session.entropy-length">session.entropy_length</link></entry>
+      <entry>"0"</entry>
+      <entry>PHP_INI_ALL</entry>
+      <entry>Entfernt in PHP 7.1.0.</entry>
+     </row>
+     <row>
+      <entry><link linkend="ini.session.bug-compat-42">session.bug_compat_42</link></entry>
+      <entry>"1"</entry>
+      <entry>PHP_INI_ALL</entry>
+      <entry>Entfernt in PHP 5.4.0.</entry>
+     </row>
+     <row>
+      <entry><link linkend="ini.session.bug-compat-warn">session.bug_compat_warn</link></entry>
+      <entry>"1"</entry>
+      <entry>PHP_INI_ALL</entry>
+      <entry>Entfernt in PHP 5.4.0.</entry>
+     </row>
     </tbody>
    </tgroup>
   </table>
@@ -551,6 +549,14 @@
       vor der Übernahme der Session durch Session-Fixation geschützt.
       Grundeinstellung <literal>0</literal> (deaktiviert).
      </simpara>
+     <note>
+      <simpara>
+      Das Aktivieren von <literal>session.use_strict_mode</literal> ist für grundsätzliche
+      Session-Sicherheit verpflichtend. Es wird empfohlen, dass alle Sites dies
+      aktiveren. Verdeutlichender Beispielcode kann der Dokumentation von
+      <function>session_create_id</function> entnommen werden.
+      </simpara>
+     </note>
     </listitem>
    </varlistentry>

@@ -579,7 +585,7 @@
       <emphasis role="strong">nur</emphasis> Cookies verwendet, um die
       Session-ID clientseitig zu speichern. Mit Aktivierung dieser Einstellung
       wird möglichen Angriffen durch Übermittlung von Session-IDs in URLs
-      vorgebeugt. Diese Einstellung wurde in PHP 4.3.0 hinzugefügt. Ab PHP
+      vorgebeugt. Ab PHP
       5.3.0 ist die Grundeinstellung <literal>1</literal> (aktiviert).
      </simpara>
     </listitem>
@@ -649,8 +655,7 @@
      <simpara>
       <literal>session.cookie_secure</literal> definiert, ob Cookies nur über
       sichere Verbindungen geschickt werden sollen. Grundeinstellung
-      <literal>off</literal>. Diese Einstellung wurde in PHP 4.0.4
-      hinzugefügt. Siehe auch <function>session_get_cookie_params</function>
+      <literal>off</literal>. Siehe auch <function>session_get_cookie_params</function>
       und <function>session_set_cookie_params</function>.
      </simpara>
     </listitem>
@@ -933,7 +938,7 @@
      </simpara>
      <note>
       <simpara>
-       Dies wurde in PHP 5 eingeführt. Entfernt in PHP 7.1.0.
+       Entfernt in PHP 7.1.0.
       </simpara>
      </note>
     </listitem>

Modified: phpdoc/de/trunk/reference/strings/functions/addslashes.xml
===================================================================
--- phpdoc/de/trunk/reference/strings/functions/addslashes.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/strings/functions/addslashes.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 334702 Maintainer: sammywg Status: ready -->
+<!-- EN-Revision: 343844 Maintainer: sammywg Status: ready -->

 <refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.addslashes">
  <refnamediv>
@@ -16,49 +16,47 @@
   </methodsynopsis>
   <para>
    Gibt einen String (Zeichenkette) zurück, in dem bestimmten
-   Zeichen ein Backslash "\" voran gestellt wurde. Diese Funktion
-   ist z.B. für Datenbankabfragen wichtig. Die behandelten Zeichen
-   sind das einfache und das doppelte Anführungszeichen
-   (<literal>'</literal> und <literal>"</literal>), der Backslash
-   selbst (<literal>\</literal>) sowie NUL (das &null;-Byte).
+   Zeichen ein Backslash "\" voran gestellt wurde. Die behandelten Zeichen
+   sind:
+   <simplelist>
+    <member>einfaches Anführungszeichen (<literal>'</literal>)</member>
+    <member>doppeltes Anführungszeichen (<literal>"</literal>)</member>
+    <member>Backslash (<literal>\</literal>)</member>
+    <member>NUL (das NUL-Byte)</member>
+   </simplelist>
   </para>
   <para>
-   Ein Beispiel für die Verwendung von <function>addslashes</function>
-   ist das Schreiben von Daten in eine Zeichenkette, die von PHP ausgewertet wird. Ist zum Beispiel
-   ein Name wie <literal>O'reilly</literal> in $str gespeichert,
-   muss $str maskiert werden (z.B. eval("echo '".addslashes($str)."';"); ).
+   Ein Anwendungsfall für die Verwendung von <function>addslashes</function>
+   ist das Maskieren der zuvor erwähnten Zeichen in einer Zeichenkette, die von
+   PHP ausgewertet werden soll.
+   <informalexample>
+    <programlisting role="php">
+<![CDATA[
+<?php
+$str = "O'Reilly?";
+eval("echo '" . addslashes($str) . "';");
+?>
+]]>
+    </programlisting>
+   </informalexample>
   </para>
   <para>
-   Um Datenbank-Parameter zu maskieren, sollte aus Sicherheitsgründen eine datenbankspezifische
-   Escapefunktion zu verwenden (z.B.
-   <function>mysqli_real_escape_string</function> für MySQL oder
-   <function>pg_escape_literal</function>, <function>pg_escape_string</function> für PostgreSQL).
-   DBMSe haben unterschiedliche Maskierungsspezifikationen für Bezeichner (z.B.
-   Tabellennamen, Feldnamen) und Parameter. Manche DBMSe wie PostgreSQL bieten
-   eine Funktion zum Maskieren von Bezeichnern,
-   <function>pg_escape_identifier</function>, aber nicht alle DBMSe bieten eine
-   solche Bezeichnermaskierungs API. Ist dies der Fall, ist die ordnungsgemäße
-   Maskierungsmethode dem Datenbank-System-Handbuch zu entnehmen.
+   Vor PHP 5.4.0 war die Direktive <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link>
+   standardmäßig <literal>on</literal>, und diese führt im Wesentlichen
+   <function>addslashes</function> auf alle GET-, POST- und COOKIE-Daten aus.
+   <function>addslashes</function> darf nicht auf Zeichenketten angewendet werden,
+   die bereits mit <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link>
+   maskiert wurden, da die Zeichenketten sonst doppelt maskiert werden.
+   <function>get_magic_quotes_gpc</function> kann verwendet werden, um zu prüfen,
+   ob <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link> gleich
+   <literal>on</literal> ist.
   </para>
   <para>
-   Verfügt das DBMS über keine Maskierungsfunktion und das DBMS verwendet
-   <literal>\</literal> um Sonderzeichen zu maskieren, können Sie u.U. diese
-   Funktion nur verwenden, wenn diese Maskierungsmethode angemessen für Ihre
-   Datenbank ist. Bitte beachten Sie, dass die Verwendung von
-   <function>addslashes</function> zum Maskieren von Datenbank-Parametern bei
-   den meisten Datenbanken Sicherheitsprobleme verursachen kann.
+   Die Funktion <function>addslashes</function> wird manchmal fälschlicherweise
+   verwendet, um zu versuchen <link linkend="security.database.sql-injection">SQL Injection</link>
+   zu verhinden. Statt dessen sollten datenbankspezifische Maskierungfunktionen
+   und/oder vorbereitete Anweisungen verwendet werden.
   </para>
-  <para>
-   Die PHP-Direktive <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link>
-   war vor PHP 5.4 standardmäßig aktiviert, sodass die Funktion
-   <function>addslashes</function> auf alle GET-, POST- und COOKIE-Daten
-   angewendet wurde. Verwenden Sie daher die Funktion
-   <function>addslashes</function> nicht, wenn Strings bereits durch
-   <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link> escaped
-   wurden, ansonsten erhalten Sie doppelte Maskierungen. Um herauszufinden,
-   ob der Parameter aktiviert ist, verwenden Sie am einfachsten die
-   Funktion <function>get_magic_quotes_gpc</function>.
-  </para>
  </refsect1>

  <refsect1 role="parameters">

Modified: phpdoc/de/trunk/reference/strings/functions/parse-str.xml
===================================================================
--- phpdoc/de/trunk/reference/strings/functions/parse-str.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/strings/functions/parse-str.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 334592 Maintainer: sammywg Status: ready -->
+<!-- EN-Revision: 343797 Maintainer: sammywg Status: ready -->

 <refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.parse-str">
  <refnamediv>
@@ -12,31 +12,15 @@
   &reftitle.description;
   <methodsynopsis>
    <type>void</type><methodname>parse_str</methodname>
-   <methodparam><type>string</type><parameter>str</parameter></methodparam>
-   <methodparam choice="opt"><type>array</type><parameter role="reference">arr</parameter></methodparam>
+   <methodparam><type>string</type><parameter>encoded_string</parameter></methodparam>
+   <methodparam choice="opt"><type>array</type><parameter role="reference">result</parameter></methodparam>
   </methodsynopsis>
   <para>
-   Verarbeitet <parameter>str</parameter>, als ob er der Query-String
+   Verarbeitet <parameter>encoded_string</parameter>, als ob er der Query-String
    einer URL-Übergabe via GET wäre, und erstellt Variablen im aktuellen
-   Geltungsbereich.
+   Geltungsbereich (oder im Array, wenn der Parameter <parameter>result</parameter>
+   übergeben wurde).
   </para>
-  <note>
-   <para>
-    Um auf den aktuellen <literal>QUERY_STRING</literal> zuzugreifen,
-    verwenden Sie am besten die Variable <varname>$_SERVER['QUERY_STRING']</varname>.
-    Weitere Informationen finden Sie auch im Abschnitt <link
-    linkend="language.variables.external">Variablen aus externen Quellen</link>.
-   </para>
-  </note>
-  <note>
-   <para>
-    Die <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link>-Einstellungen
-    beeinflussen die Ausgabe der Funktion, da <function>parse_str</function>
-    dieselben Mechanismen verwendet, die PHP zum Füllen von
-    <varname>$_GET</varname>, <varname>$_POST</varname> und anderen Variablen
-    nutzt.
-   </para>
-  </note>
  </refsect1>

  <refsect1 role="parameters">
@@ -44,7 +28,7 @@
   <para>
    <variablelist>
     <varlistentry>
-     <term><parameter>str</parameter></term>
+     <term><parameter>encoded_string</parameter></term>
      <listitem>
       <para>
        Die Eingabezeichenkette.
@@ -52,7 +36,7 @@
      </listitem>
     </varlistentry>
     <varlistentry>
-     <term><parameter>arr</parameter></term>
+     <term><parameter>result</parameter></term>
      <listitem>
       <para>
        Ist der zweite Parameter <parameter>arr</parameter>
@@ -59,6 +43,24 @@
        angegeben, werden die Variablen in diesem Array als dessen Elemente
        gespeichert.
       </para>
+
+      <warning>
+       <para>
+        Von der Verwendung dieser Funktion ohne den zweiten Parameter wird
+        unbedingt <emphasis>ABGERATEN</emphasis>, und von PHP 7.2 an
+        <emphasis>MISSBILLIGT</emphasis>.
+       </para>
+       <para>
+        Das dynamische Zuweisen von Variablen im
+        Geltungsbereich einer Funktion hat genaue dieselben Probleme wie
+        <link linkend="ini.register-globals">register_globals</link>.
+       </para>
+       <para>
+        Die Erklärung warum dies gefährlich ist, kann dem Sicherheits-Abschnitt
+        zur <link linkend="security.globals">Verwendung von Register Globals</link>
+        entnommen werden.
+       </para>
+      </warning>
      </listitem>
     </varlistentry>
    </variablelist>
@@ -72,6 +74,31 @@
   </para>
  </refsect1>

+ <refsect1 role="changelog">
+  &reftitle.changelog;
+  <para>
+   <informaltable>
+    <tgroup cols="2">
+     <thead>
+      <row>
+       <entry>&Version;</entry>
+       <entry>&Description;</entry>
+      </row>
+     </thead>
+     <tbody>
+      <row>
+       <entry>7.2.0</entry>
+       <entry>
+        Die Verwendung von <function>parse_str</function> ohne den zweiten Parameter
+        erzeugt nun einen <constant>E_DEPRECATED</constant> Fehler.
+       </entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </informaltable>
+  </para>
+ </refsect1>
+
  <refsect1 role="examples">
   &reftitle.examples;
   <para>
@@ -80,24 +107,74 @@
     <programlisting role="php">
 <![CDATA[
 <?php
-$str = "first=value&arr[]=foo+bar&arr[]=baz";
-parse_str($str);
-echo $first;  // value
-echo $arr[0]; // foo bar
-echo $arr[1]; // baz
+$str = "erstes=wert&arr[]=foo+bar&arr[]=baz";

+// Empfohlen
 parse_str($str, $output);
-echo $output['first'];  // value
+echo $output['erstes'];  // value
 echo $output['arr'][0]; // foo bar
 echo $output['arr'][1]; // baz

+// NICHT EMPFOHLEN
+parse_str($str);
+echo $erstes;  // value
+echo $arr[0]; // foo bar
+echo $arr[1]; // baz
 ?>
 ]]>
     </programlisting>
    </example>
   </para>
+  <para>
+   Weil PHP-Variablen keine Punkte oder Leerzeichen im Namen enthalten dürfen,
+   werden dieser in Unterstriche umgewandelt. Dasselbe gilt für die entsprechenden
+   Schlüsselnamen, für den Fall, dass diese Funktion mit dem Parameter
+   <parameter>result</parameter> verwendet wird.
+   <example>
+    <title><function>parse_str</function> name mangling</title>
+    <programlisting role="php">
+<![CDATA[
+<?php
+parse_str("Mein Wert=Etwas");
+echo $Mein_Wert; // Etwas
+
+parse_str("Mein Wert=Etwas", $output);
+echo $output['Mein_Wert']; // Etwas
+?>
+]]>
+    </programlisting>
+   </example>
+  </para>
  </refsect1>

+ <refsect1 role="notes">
+  &reftitle.notes;
+
+  <note>
+   <para>
+    Alle erzeugten Variablen (oder Werte, die im Array zurückgegeben werden, wenn
+    der zweite Parameter übergeben wurde) wurden bereits mit <function>urldecode</function>
+    vorbereitet.
+   </para>
+  </note>
+  <note>
+   <para>
+    Um auf den aktuellen <literal>QUERY_STRING</literal> zuzugreifen, kann
+    die Variable <varname>$_SERVER['QUERY_STRING']</varname> verwendet werden.
+    Weitere Informationen finden sich auch im Abschnitt <link
+    linkend="language.variables.external">Variablen aus externen Quellen</link>.
+   </para>
+  </note>
+  <note>
+   <para>
+    Die <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link>-Einstellung
+    beeinflusst die Ausgabe dieser Funktion, da <function>parse_str</function>
+    dieselben Mechanismen verwendet, die PHP zum Füllen der Variablen
+    <varname>$_GET</varname>, <varname>$_POST</varname>, etc. nutzt.
+   </para>
+  </note>
+ </refsect1>
+
  <refsect1 role="seealso">
   &reftitle.seealso;
   <para>
@@ -105,7 +182,6 @@
     <member><function>parse_url</function></member>
     <member><function>pathinfo</function></member>
     <member><function>http_build_query</function></member>
-    <member><function>get_magic_quotes_gpc</function></member>
     <member><function>urldecode</function></member>
    </simplelist>
   </para>
@@ -113,7 +189,6 @@

 </refentry>

-
 <!-- Keep this comment at the end of the file
 Local variables:
 mode: sgml

Modified: phpdoc/de/trunk/reference/strings/functions/stripos.xml
===================================================================
--- phpdoc/de/trunk/reference/strings/functions/stripos.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/strings/functions/stripos.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 336195 Maintainer: sammywg Status: ready -->
+<!-- EN-Revision: 343898 Maintainer: sammywg Status: ready -->
+
 <refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.stripos">
  <refnamediv>
   <refname>stripos</refname>
@@ -11,7 +12,7 @@
  <refsect1 role="description">
   &reftitle.description;
   <methodsynopsis>
-   <type>mixed</type><methodname>stripos</methodname>
+   <type>int</type><methodname>stripos</methodname>
    <methodparam><type>string</type><parameter>haystack</parameter></methodparam>
    <methodparam><type>string</type><parameter>needle</parameter></methodparam>
    <methodparam choice="opt"><type>int</type><parameter>offset</parameter><initializer>0</initializer></methodparam>
@@ -58,8 +59,8 @@
      <listitem>
       <para>
        Wenn angegeben, dann beginnt die Suche diese Anzahl an Zeichen gezählt
-       vom Beginn des Strings. Im Gegensatz zu <function>strrpos</function> und
-       <function>strripos</function> kann der Offset nicht negativ sein.
+       vom Beginn des Strings. Ist der Offset negativ, beginnt die Suche diese
+       Anzahl von Zeichen gezählt vom Ende der Zeichenkette.
       </para>
      </listitem>
     </varlistentry>
@@ -80,6 +81,28 @@
   &return.falseproblem;
  </refsect1>

+ <refsect1 role="changelog">
+  &reftitle.changelog;
+  <informaltable>
+   <tgroup cols="2">
+    <thead>
+     <row>
+      <entry>&Version;</entry>
+      <entry>&Description;</entry>
+     </row>
+    </thead>
+    <tbody>
+     <row>
+      <entry>7.1.0</entry>
+      <entry>
+       Unterstützung für negative <parameter>offset</parameter>-Werte wurde hinzugefügt.
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </informaltable>
+ </refsect1>
+
  <refsect1 role="examples">
   &reftitle.examples;
   <para>

Modified: phpdoc/de/trunk/reference/strings/functions/strpos.xml
===================================================================
--- phpdoc/de/trunk/reference/strings/functions/strpos.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/strings/functions/strpos.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 315994 Maintainer: sammywg Status: ready -->
+<!-- EN-Revision: 343898 Maintainer: sammywg Status: ready -->

 <refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.strpos">
  <refnamediv>
   <refname>strpos</refname>
-  <refpurpose>Sucht das erste Vorkommen des Suchstrings</refpurpose>
+  <refpurpose>Sucht die Position des ersten Vorkommens des Suchstrings in einem String</refpurpose>
  </refnamediv>

  <refsect1 role="description">
   &reftitle.description;
   <methodsynopsis>
-   <type>mixed</type><methodname>strpos</methodname>
+   <type>int</type><methodname>strpos</methodname>
    <methodparam><type>string</type><parameter>haystack</parameter></methodparam>
    <methodparam><type>mixed</type><parameter>needle</parameter></methodparam>
    <methodparam choice="opt"><type>int</type><parameter>offset</parameter><initializer>0</initializer></methodparam>
   </methodsynopsis>
   <para>
-     Gibt die numerische Position des ersten Vorkommens von
-     <parameter>needle</parameter> innerhalb der Zeichenkette
-     <parameter>haystack</parameter> zurück.
-    </para>
+   Gibt die numerische Position des ersten Vorkommens von
+   <parameter>needle</parameter> innerhalb der Zeichenkette
+   <parameter>haystack</parameter> zurück.
+  </para>
  </refsect1>

  <refsect1 role="parameters">
@@ -48,11 +48,9 @@
      <term><parameter>offset</parameter></term>
      <listitem>
       <para>
-     Der optionale Parameter <parameter>offset</parameter> ermöglicht
-     es Ihnen, die Startposition für die Suche innerhalb von
-     <parameter>haystack</parameter> anzugeben. Die zurück gegebene
-     Positions-Angabe ist dann relativ zum Anfang von
-     <parameter>haystack</parameter>.
+       Wenn angegeben, wird die Suche diese Anzahl an Zeichen vom Anfang der
+       Zeichenkette gezählt beginnen. Ist der Wert negativ, beginnt die Suche
+       stattdessen diese Anzahl an Zeichen vom Ende des Strings gezählt.
       </para>
      </listitem>
     </varlistentry>
@@ -63,13 +61,39 @@
  <refsect1 role="returnvalues">
   &reftitle.returnvalues;
   <para>
-   Gibt die Position als Integerwert zurück. Wurde <parameter>needle</parameter>
-   nicht gefunden, gibt <function>strpos</function> den <type>boolean</type>-Wert
-   &false; zurück.
+   Gibt die Position des Vorkommens von <parameter>needle</parameter> relativ
+   zum Anfang der Zeichenkette <parameter>haystack</parameter> (unabhängig von
+   <parameter>offset</parameter>). Es ist ebenfalls zu beachten, dass
+   Stringpositionen bei 0 beginnen, und nicht bei 1.
   </para>
+  <para>
+   Returns &false; if the needle was not found.
+  </para>
   &return.falseproblem;
  </refsect1>

+ <refsect1 role="changelog">
+  &reftitle.changelog;
+  <informaltable>
+   <tgroup cols="2">
+    <thead>
+     <row>
+      <entry>&Version;</entry>
+      <entry>&Description;</entry>
+     </row>
+    </thead>
+    <tbody>
+     <row>
+      <entry>7.1.0</entry>
+      <entry>
+       Unterstützung für negative <parameter>offset</parameter>-Werte wurde hinzugefügt.
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </informaltable>
+ </refsect1>
+
  <refsect1 role="examples">
   &reftitle.examples;
   <para>
@@ -143,13 +167,13 @@
   &reftitle.seealso;
   <para>
    <simplelist>
+    <member><function>stripos</function></member>
     <member><function>strrpos</function></member>
-    <member><function>stripos</function></member>
     <member><function>strripos</function></member>
-    <member><function>strrchr</function></member>
+    <member><function>strstr</function></member>
+    <member><function>strpbrk</function></member>
     <member><function>substr</function></member>
-    <member><function>stristr</function></member>
-    <member><function>strstr</function></member>
+    <member><function>preg_match</function></member>
    </simplelist>
   </para>
  </refsect1>

Modified: phpdoc/de/trunk/reference/strings/functions/strrpos.xml
===================================================================
--- phpdoc/de/trunk/reference/strings/functions/strrpos.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/strings/functions/strrpos.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: 334621 Maintainer: simp Status: ready -->
+<!-- EN-Revision: 338916 Maintainer: simp Status: ready -->
 <!-- Credits: sammywg -->

 <refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.strrpos">

Modified: phpdoc/de/trunk/reference/tokenizer/functions/token-get-all.xml
===================================================================
--- phpdoc/de/trunk/reference/tokenizer/functions/token-get-all.xml	2018-04-21 20:48:18 UTC (rev 344796)
+++ phpdoc/de/trunk/reference/tokenizer/functions/token-get-all.xml	2018-04-21 21:23:55 UTC (rev 344797)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- EN-Revision: 338345 Maintainer: nobody Status: ready -->
+<!-- EN-Revision: 338346 Maintainer: nobody Status: ready -->
 <!-- $Revision$ -->

 <refentry xml:id="function.token-get-all" xmlns="http://docbook.org/ns/docbook">
@@ -24,6 +24,7 @@
    in seinen Textrepäsentanten verwenden.
   </para>
  </refsect1>
+
  <refsect1 role="parameters">
   &reftitle.parameters;
   <para>
@@ -55,6 +56,7 @@
    </variablelist>
   </para>
  </refsect1>
+
  <refsect1 role="returnvalues">
   &reftitle.returnvalues;
   <para>
@@ -65,32 +67,98 @@
    originalen Textinhalt und die Zeilennummer im dritten Element.
   </para>
  </refsect1>
+
+ <refsect1 role="changelog">
+  &reftitle.changelog;
+  <para>
+   <informaltable>
+    <tgroup cols="2">
+     <thead>
+      <row>
+       <entry>&Version;</entry>
+       <entry>&Description;</entry>
+      </row>
+     </thead>
+     <tbody>
+      <row>
+       <entry>7.0.0</entry>
+       <entry>
+        Der optionale <parameter>flags</parameter> Parameter wurde mitsamt
+        dem <constant>TOKEN_PARSE</constant>-Flag hinzugefügt.
+       </entry>
+      </row>
+      <row>
+       <entry>5.2.2</entry>
+       <entry>
+        Die Zeilennummer wird im dritten Element zurückgegeben
+       </entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </informaltable>
+  </para>
+ </refsect1>
+
  <refsect1 role="examples">
   &reftitle.examples;
   <para>
    <example>
-    <title><function>token_get_all</function> Beispiele</title>
+    <title><function>token_get_all</function> Beispiel</title>
     <programlisting role="php">
 <![CDATA[
 <?php
-$tokens = token_get_all('<?php echo; ?>'); /* => array(
-                                                  array(T_OPEN_TAG, '<?php'),
-                                                  array(T_ECHO, 'echo'),
-                                                  ';',
-                                                  array(T_CLOSE_TAG, '?>') ); */
+$tokens = token_get_all('<?php echo; ?>');

-/* Beachten Sie, dass im folgenden Beispiel die Zeichenkette geparst wurde
-   als T_INLINE_HTML und nicht wie erwartet als T_COMMENT (T_ML_COMMENT in PHP <5).
-   Das liegt an den fehlenden Beginn-/Endetags die im "Quelltext" verwendet wurden.
-   Das entspricht einem Kommentar außerhalb der <?php ?> Tags in einer normalen Datei. */
-$tokens = token_get_all('/* comment */'); // => array(array(T_INLINE_HTML, '/* comment */'));
+foreach ($tokens as $token) {
+    if (is_array($token)) {
+        echo "Line {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;
+    }
+}
 ?>
 ]]>
     </programlisting>
+    &example.outputs.similar;
+    <screen>
+<![CDATA[
+Line 1: T_OPEN_TAG ('<?php ')
+Line 1: T_ECHO ('echo')
+Line 1: T_WHITESPACE (' ')
+Line 1: T_CLOSE_TAG ('?>')
+]]>
+    </screen>
    </example>
   </para>
   <para>
    <example>
+    <title>Fehlerhaftes <function>token_get_all</function> Verwendungsbeispiel</title>
+    <programlisting role="php">
+<![CDATA[
+<?php
+$tokens = token_get_all('/* comment */');
+
+foreach ($tokens as $token) {
+    if (is_array($token)) {
+        echo "Zeile {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;
+    }
+}
+?>
+]]>
+    </programlisting>
+    &example.outputs.similar;
+    <screen>
+<![CDATA[
+Zeile 1: T_INLINE_HTML ('/* comment */')
+]]>
+    </screen>
+   </example>
+   Es ist zu beachten, dass im vorigen Beispiel die Zeichenkette als
+   <constant>T_INLINE_HTML</constant> und nicht wie erwartet als
+   <constant>T_COMMENT</constant> geparst wurde. Das liegt am fehlenden Start-Tag
+   im verwendeten Code. Das entspricht einem Kommentar außerhalb der PHP-Tags in
+   einer normalen Datei.
+  </para>
+  <para>
+   <example>
     <title>
      <function>token_get_all</function> für eine Klasse, die ein reserviertes
      Wort benutzt
@@ -137,35 +205,16 @@
    <constant>T_PUBLIC</constant> statt <constant>T_STRING</constant> sein.
   </para>
  </refsect1>
- <refsect1 role="changelog">
-  &reftitle.changelog;
+
+ <refsect1 role="seealso">
+  &reftitle.seealso;
   <para>
-   <informaltable>
-    <tgroup cols="2">
-     <thead>
-      <row>
-       <entry>&Version;</entry>
-       <entry>&Description;</entry>
-      </row>
-     </thead>
-     <tbody>
-      <row>
-       <entry>7.0.0</entry>
-       <entry>
-        Der optionale <parameter>flags</parameter> Parameter wurde mitsamt
-        dem <constant>TOKEN_PARSE</constant>-Flag hinzugefügt.
-       </entry>
-      </row>
-      <row>
-       <entry>5.2.2</entry>
-       <entry>Die Zeilennummer wird im dritten Element zurückgegeben
-       </entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </informaltable>
+   <simplelist>
+    <member><function>token_name</function></member>
+   </simplelist>
   </para>
  </refsect1>
+
 </refentry>

 <!-- Keep this comment at the end of the file
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.