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 <= 4.2.3. PHP_INI_PERDIR in PHP < 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