1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-24 07:12:15 +01:00
Files
archived-doc-de/language/types/numeric-strings.xml
Martin Samesch e978f2d900 Sync with EN
2025-04-23 13:42:49 +02:00

169 lines
6.1 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: samesch Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.numeric-strings" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Numerische Zeichenketten</title>
<para>
In PHP gilt eine Zeichenkette (Typ <type>string</type>) als numerisch, wenn
er als Ganzzahl (<type>int</type>) oder Gleitkommazahl (<type>float</type>)
interpretiert werden kann.
</para>
<para>
Formal seit PHP 8.0.0:
</para>
<informalexample>
<programlisting>
<![CDATA[
WHITESPACES \s*
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
]]>
</programlisting>
</informalexample>
<para>
In PHP gibt es auch das Konzept der <emphasis>vorangestellten</emphasis>
numerischen Zeichenkette. Dies ist einfach eine Zeichenkette, die wie eine
numerische Zeichenkette beginnt, auf die beliebige Zeichen folgen.
</para>
<note>
<para>
Jede Zeichenkette, die den Buchstaben <literal>E</literal> (Groß- und
Kleinschreibung wird nicht berücksichtigt) enthält, wird als Zahl in
wissenschaftlicher Notation betrachtet. Dies kann zu unerwarteten
Ergebnissen führen.
</para>
<example>
<title>Vergleich wissenschaftlicher Schreibweisen</title>
<programlisting role="php">
<![CDATA[
<?php
var_dump("0D1" == "000"); // false, "0D1" ist keine wissenschaftliche Schreibweise
var_dump("0E1" == "000"); // true, "0E1" ist 0 * (10 ^ 1) also 0
var_dump("2E1" == "020"); // true, "2E1" ist 2 * (10 ^ 1) also 20
?>
]]>
</programlisting>
</example>
</note>
<sect2 xml:id="language.types.numeric-string.conversion">
<title>Zeichenketten, die im numerischen Kontext verwendet werden</title>
<para>
Wenn ein Wert vom Typ <type>string</type> als Zahl ausgewertet werden muss
(&zb; arithmetische Operationen, Deklaration des Typs <type>int</type>
usw.), werden die folgenden Schritte durchgeführt, um das Ergebnis zu
ermitteln:
<orderedlist>
<listitem>
<simpara>
Wenn der <type>String</type> numerisch ist, wird er in einen
<type>Int</type> aufgelöst, sofern er eine ganzzahlige numerische
Zeichenkette ist und gemäß der Definition von
<constant>PHP_INT_MAX</constant> innerhalb der Grenzen des Typs
<type>int</type> liegt, ansonsten wird er in einen <type>Float</type>
aufgelöst.
</simpara>
</listitem>
<listitem>
<simpara>
Wenn der Kontext vorangestellte numerische Zeichenketten erlaubt und der
<type>String</type> eine solche ist, wird in einen <type>Int</type>
aufgelöst, sofern der vorangestellte Teil des <type>String</type>s eine
ganzzahlige numerische Zeichenkette ist und gemäß der Definition von
<constant>PHP_INT_MAX</constant> innerhalb der Grenzen des Typs
<type>int</type> liegt, ansonsten wird in einen <type>Float</type>
aufgelöst. Darüber hinaus wird ein Fehler der Stufe
<constant>E_WARNING</constant> ausgelöst.
</simpara>
</listitem>
<listitem>
<simpara>
Wenn der <type>String</type> nicht numerisch ist, wird eine
<classname>TypeError</classname>-Exception geworfen.
</simpara>
</listitem>
</orderedlist>
</para>
</sect2>
<sect2 xml:id="language.types.numeric-string.prior">
<title>Verhalten vor PHP 8.0.0</title>
<para>
Vor PHP 8.0.0 galt ein <type>String</type> nur dann als numerisch, wenn er
ein <emphasis>vorangestelltes</emphasis> Leerzeichen enthielt. Wenn er ein
<emphasis>nachgestelltes</emphasis> Leerzeichen enthielt, wurde er als
vorangestellt numerisch betrachtet.
</para>
<para>
Wenn vor PHP 8.0.0 eine Zeichenkette in einem numerischen Kontext verwendet
wurde, wurden die gleichen Schritte wie oben beschrieben durchgeführt, mit
den folgenden Unterschieden:
<itemizedlist>
<listitem>
<simpara>
Bei Verwendung einer führenden numerischen Zeichenkette wurde ein
<constant>E_NOTICE</constant> anstelle eines
<constant>E_WARNING</constant> ausgelöst.
</simpara>
</listitem>
<listitem>
<simpara>
Wenn die Zeichenkette nicht numerisch war, wurde ein
<constant>E_WARNING</constant> ausgelöst und der Wert
<literal>0</literal> zurückgegeben.
</simpara>
</listitem>
</itemizedlist>
Vor PHP 7.1.0 wurde weder <constant>E_NOTICE</constant> noch
<constant>E_WARNING</constant> ausgelöst.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo = 1 + "10.5"; // $foo ist vom Typ float (11.5)
$foo = 1 + "-1.3e3"; // $foo ist vom Typ float (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError seit PHP 8.0.0; davor ist $foo vom Typ integer (1)
$foo = 1 + "bob3"; // TypeError seit PHP 8.0.0; davor ist $foo vom Typ integer (1)
$foo = 1 + "10 Small Pigs"; // $foo ist vom Typ integer (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // $foo ist vom Typ float (14.2) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = "10.0 pigs " + 1; // $foo ist vom Typ float (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = "10.0 pigs " + 1.0; // $foo ist vom Typ float (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
?>
]]>
</programlisting>
</informalexample>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->