<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration73.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'migration73.incompatible.php',
    1 => 'Nicht abw&auml;rtskompatible &Auml;nderungen',
    2 => 'Nicht abw&auml;rtskompatible &Auml;nderungen',
  ),
  'up' => 
  array (
    0 => 'migration73.php',
    1 => 'Migration von PHP 7.2.x auf PHP 7.3.x',
  ),
  'prev' => 
  array (
    0 => 'migration73.constants.php',
    1 => 'Neue globale Konstanten',
  ),
  'next' => 
  array (
    0 => 'migration73.deprecated.php',
    1 => 'Veraltete Features',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'appendices/migration73/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration73.incompatible" class="sect1">
 <h2 class="title">Nicht abwärtskompatible Änderungen</h2>

 <div class="sect2" id="migration73.incompatible.core">
  <h3 class="title">PHP-Kern</h3>

  <div class="sect3" id="migration73.incompatible.core.heredoc-nowdoc">
   <h4 class="title">Interpretation des schließenden Heredoc/Nowdoc-Bezeichners</h4>

   <p class="para">
    Durch die Einführung der
    <a href="migration73.new-features.php#migration73.new-features.core.heredoc" class="link">flexiblen Heredoc/Nowdoc-Syntax</a>
    können doc-Zeichenketten, die den schließenden Bezeichner in ihrem Körper
    enthalten, zu Syntaxfehlern oder einer veränderten Interpretation führen.
    Zum Beispiel in:
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$str </span><span style="color: #007700">= &lt;&lt;&lt;FOO<br /></span><span style="color: #DD0000">abcdefg<br /></span><span style="color: #007700">   FOO<br /></span><span style="color: #0000BB">FOO</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    hatte das eingerückte <code class="literal">FOO</code> bisher keine besondere
    Bedeutung. Nun wird es als Ende der Heredoc-Zeichenkette interpretiert und
    das folgende <code class="literal">FOO;</code> führt zu einem Syntaxfehler. Dieses
    Problem kann immer gelöst werden, indem ein schließender Bezeichner
    gewählt wird, der nicht im Inhalt der Zeichenkette vorkommt.
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.continue-targeting-switch">
   <h4 class="title">Warnung bei continue in switch-Anweisung</h4>

   <p class="para">
    Eine <code class="literal">continue</code>-Anweisung, die in einer
    <code class="literal">switch</code>-Kontrollstruktur verwendet wird, erzeugt nun
    eine Warnung. In PHP sind solche <code class="literal">continue</code>-Anweisungen
    gleichbedeutend mit <code class="literal">break</code>, während sie sich in anderen
    Sprachen wie <code class="literal">continue 2</code> verhalten.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">while (</span><span style="color: #0000BB">$foo</span><span style="color: #007700">) {<br />    switch (</span><span style="color: #0000BB">$bar</span><span style="color: #007700">) {<br />      case </span><span style="color: #DD0000">"baz"</span><span style="color: #007700">:<br />         continue;<br />         </span><span style="color: #FF8000">// Warning: "continue" targeting switch is equivalent to<br />         //          "break". Did you mean to use "continue 2"?<br />   </span><span style="color: #007700">}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.arrayaccess">
   <h4 class="title">Strikte Interpretation von ganzzahligen Zeichenketten-Schlüsseln bei ArrayAccess</h4>

   <p class="para">
    Ein Array-Zugriff vom Typ <code class="literal">$obj[&quot;123&quot;]</code>, worin
    <code class="literal">$obj</code> <span class="classname"><a href="class.arrayaccess.php" class="classname">ArrayAccess</a></span> implementiert
    und <code class="literal">&quot;123&quot;</code> ein ganzzahliges
    Literal vom Typ <span class="type"><a href="language.types.string.php" class="type string">string</a></span> ist, führt nicht mehr zu einer
    impliziten Umwandlung in eine Ganzzahl, d. h., anstelle von
    <code class="literal">$obj-&gt;offsetGet(123)</code> wird nun
    <code class="literal">$obj-&gt;offsetGet(&quot;123&quot;)</code> aufgerufen. Dies entspricht dem
    bestehenden Verhalten für nicht-literale Werte. Das Verhalten von Arrays
    wird davon in keiner Weise beeinflusst; sie wandeln ganzzahlige
    Zeichenketten-Schlüssel weiterhin implizit in Ganzzahlen um.
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.static-properties">
   <h4 class="title">Statische Eigenschaften werden nicht mehr durch Referenzzuweisung getrennt</h4>

   <p class="para">
    In PHP werden statische Eigenschaften von vererbenden Klassen gemeinsam
    genutzt, es sei denn, die statische Eigenschaft wird in einer Kindklasse
    explizit überschrieben. Allerdings war es aufgrund eines
    Implementierungs-Artefakts möglich, die statischen Eigenschaften durch
    Zuweisung einer Referenz zu trennen. Dieses Schlupfloch wurde nun behoben.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{<br />    public static </span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />}<br />class </span><span style="color: #0000BB">Test2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Test </span><span style="color: #007700">{ }<br /><br /></span><span style="color: #0000BB">Test2</span><span style="color: #007700">::</span><span style="color: #0000BB">$x </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$x</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Test</span><span style="color: #007700">::</span><span style="color: #0000BB">$x</span><span style="color: #007700">, </span><span style="color: #0000BB">Test2</span><span style="color: #007700">::</span><span style="color: #0000BB">$x</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Vorher:     int(0), int(1)<br />// Nun:        int(1), int(1)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.reference-unwrapping">
   <h4 class="title">Referenzen, die von Array- und Eigenschafts-Zugriffen zurückgegeben werden, werden sofort aufgelöst</h4>

   <p class="para">
    Eine Referenz, die von einem Array- oder Eigenschafts-Zugriff
    zurückgegeben wird, wird nun im Zuge des Zugriffs aufgelöst. Das bedeutet,
    dass es nicht mehr möglich ist, die Referenz zwischen dem Zugriff und der
    Verwendung des Wertes, auf den zugegriffen wurde, zu verändern:
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$arr </span><span style="color: #007700">= [</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$ref </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">] + (</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">] = </span><span style="color: #0000BB">2</span><span style="color: #007700">));<br /></span><span style="color: #FF8000">// Vorher: int(4), Nun: int(3)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    Dadurch wird das Verhalten von Referenzen und Nicht-Referenzen konsistent.
    Es ist zu beachten, dass das Lesen und Schreiben eines Wertes innerhalb
    eines einzelnen Ausdrucks weiterhin undefiniertes Verhalten bleibt und
    sich in der Zukunft wieder ändern kann.
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.traversable-unpacking">
   <h4 class="title">Entpacken von Parametern bei Traversables mit nicht-ganzzahligen Schlüsseln wird nicht mehr unterstützt</h4>

   <p class="para">
    Das Entpacken von Parametern funktioniert bei
    <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span>s mit nicht-ganzzahligen Schlüsseln
    nicht mehr. Der folgende Code funktionierte in PHP 5.6-7.2 unbeabsichtigt.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(...</span><span style="color: #0000BB">$args</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">);<br />}<br />function </span><span style="color: #0000BB">gen</span><span style="color: #007700">() {<br />    yield </span><span style="color: #0000BB">1.23 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">123</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(...</span><span style="color: #0000BB">gen</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.misc">
   <h4 class="title">Verschiedenes</h4>

   <p class="para">
    Das Hilfsprogramm <var class="filename">ext_skel</var> wurde komplett
    überarbeitet; neue Optionen wurden hinzugefügt und einige alte Optionen
    entfernt. Es ist nun in PHP geschrieben und hat keine externen
    Abhängigkeiten.
   </p>

   <p class="para">
    Die Unterstützung für BeOS wurde eingestellt.
   </p>

   <p class="para">
    Exceptions, die im Modus <code class="literal">EH_THROW</code> durch die
    automatische Umwandlung von Warnungen in Exceptions ausgelöst werden (z. B.
    einige <span class="classname"><a href="class.datetime.php" class="classname">DateTime</a></span>-Exceptions), füllen den Bereich von
    <span class="function"><a href="function.error-get-last.php" class="function">error_get_last()</a></span> nicht mehr mit Daten. Damit
    funktionieren sie nun genauso wie manuell ausgelöste Exceptions.
   </p>

   <p class="para">
    <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> meldet nun falsche Typen als
    <code class="literal">int</code> und <code class="literal">bool</code> anstelle von
    <code class="literal">integer</code> bzw. <code class="literal">boolean</code>.
   </p>

   <p class="para">
    Undefinierte Variablen, die an <span class="function"><a href="function.compact.php" class="function">compact()</a></span> übergeben
    werden, werden nun als Hinweis gemeldet.
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="function.getimagesize.php" class="function">getimagesize()</a></span> und verwandte Funktionen
    melden nun den Mime-Typ von BMP-Bildern als <code class="literal">image/bmp</code>
    anstelle von <code class="literal">image/x-ms-bmp</code>, da ersterer bei der IANA
    registriert ist (siehe <a href="https://datatracker.ietf.org/doc/html/rfc7903" class="link external">&raquo;&nbsp;RFC 7903</a>).
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="function.stream-socket-get-name.php" class="function">stream_socket_get_name()</a></span> gibt nun
    IPv6-Adressen zurück, die in Klammern eingeschlossen sind. Zum Beispiel
    wird nun <code class="literal">&quot;[::1]:1337&quot;</code> anstelle von
    <code class="literal">&quot;::1:1337&quot;</code> zurückgegeben.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration73.incompatible.bc">
  <h3 class="title">BCMath mathematische Berechnungen mit beliebiger Genauigkeit</h3>

  <p class="para">
   Alle Warnungen, die von <a href="ref.bc.php" class="link">BCMath-Funktionen</a>
   ausgelöst werden, verwenden nun die Fehlerbehandlung von PHP. Zuvor wurden
   einige Warnungen direkt nach stderr geschrieben.
  </p>

  <p class="para">
   Die Funktionen <span class="function"><a href="function.bcmul.php" class="function">bcmul()</a></span> und <span class="function"><a href="function.bcpow.php" class="function">bcpow()</a></span>
   geben nun Zahlen mit der geforderten Genauigkeit zurück. Zuvor wurden in
   den zurückgegebenen Zahlen unter Umständen die Dezimalnullen am Ende
   weggelassen.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.imap">
  <h3 class="title">IMAP, POP3 und NNTP</h3>

  <p class="para">
   Anmeldungen über <strong class="command">rsh</strong>/<strong class="command">ssh</strong> sind
   standardmäßig deaktiviert. Um dies zu ändern, muss
   <a href="imap.configuration.php#ini.imap.enable-insecure-rsh" class="link">imap.enable_insecure_rsh</a>
   verwendet werden. Es ist zu beachten, dass die IMAP-Bibliothek die Namen
   der Postfächer nicht filtert, bevor sie an den
   <strong class="command">rsh</strong>/<strong class="command">ssh</strong>-Befehl übergeben werden.
   Daher sollten bei aktiviertem <strong class="command">rsh</strong>/<strong class="command">ssh</strong>
   keine nicht vertrauenswürdigen Daten an diesen Befehl übergeben werden.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.mbstring">
  <h3 class="title">Multibyte-Zeichenketten</h3>

  <p class="para">
   Aufgrund der hinzugefügten Unterstützung für benannte Teilsuchmuster
   verhalten sich <code class="literal">mb_ereg_*()</code>-Suchmuster, die diese
   verwenden, anders. Insbesondere werden benannte Teilsuchmuster Teil der
   Treffer sein und <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> wird die zusätzliche
   Syntax auswerten. Siehe
   <a href="migration73.new-features.php#migration73.new-features.mbstring.named-captures" class="link">Benannte Teilsuchmuster</a>
   für weitere Informationen.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.mysqli">
  <h3 class="title">Verbesserte MySQL-Erweiterung (MySQLi)</h3>

  <p class="para">
   Vorbereitete Anweisungen (Prepared Statements) geben die Sekundenbruchteile
   bei <code class="literal">DATETIME</code>-, <code class="literal">TIME</code>- und
   <code class="literal">TIMESTAMP</code>-Spalten mit Dezimalspezifizierer (z. B.
   <code class="literal">TIMESTAMP(6)</code> bei Verwendung von Mikrosekunden) nun
   korrekt an. In früheren Versionen wurden sie in den zurückgegebenen Werten
   einfach weggelassen.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.pdo-mysql">
  <h3 class="title">MySQL-Funktionen (PDO_MYSQL)</h3>

  <p class="para">
   Vorbereitete Anweisungen geben die Sekundenbruchteile bei
   <code class="literal">DATETIME</code>-, <code class="literal">TIME</code>- und
   <code class="literal">TIMESTAMP</code>-Spalten mit Dezimalspezifizierer (z. B.
   <code class="literal">TIMESTAMP(6)</code> bei Verwendung von Mikrosekunden) nun
   korrekt an. In früheren Versionen wurden sie in den zurückgegebenen Werten
   einfach weggelassen. Zu beachten ist, dass dies nur die
   <a href="ref.pdo-mysql.php" class="link">PDO_MYSQL</a>-Anweisungen betrifft, bei
   denen die Emulation vorbereiteter Anweisungen deaktiviert ist (z. B. bei
   Verwendung der nativen Prepair-Funktionalität von MySQL). Anweisungen, die
   Verbindungen mit <strong><code><a href="pdo.constants.php#pdo.constants.attr-emulate-prepares">PDO::ATTR_EMULATE_PREPARES</a></code></strong>=<strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>
   verwenden (die Standardeinstellung), waren von dem behobenen Fehler nicht
   betroffen und erhielten bereits korrekte Sekundenbruchteile von der Engine.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.reflection">
  <h3 class="title">Reflection</h3>

  <p class="para">
   Beim Exportieren von
   <a href="book.reflection.php" class="link">Reflection</a>-Objekten in Zeichenketten
   werden nun <code class="literal">int</code> und <code class="literal">bool</code> anstelle von
   <code class="literal">integer</code> bzw. <code class="literal">boolean</code> verwendet.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.spl">
  <h3 class="title">Standard-PHP-Bibliothek (SPL)</h3>

  <p class="para">
   Wenn ein <a href="book.spl.php" class="link">SPL</a>-Autoloader eine Exception
   auslöst, werden die folgenden Autoloader nicht mehr ausgeführt. Zuvor
   wurden alle Autoloader ausgeführt und die Exceptions wurden verkettet.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.simplexml">
  <h3 class="title">SimpleXML</h3>

  <p class="para">
   Wenn eine mathematische Operation ein
   <a href="book.simplexml.php" class="link">SimpleXML</a>-Objekt enthält, wird der
   Text nun als <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> oder <span class="type"><a href="language.types.float.php" class="type float">float</a></span> behandelt, je
   nachdem, was besser geeignet ist. Zuvor wurden Werte grundsätzlich als
   <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>s behandelt.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.cookie-decode">
  <h3 class="title">Eingehende Cookies</h3>

  <p class="para">
   Seit PHP 7.3.23 werden die <em>Namen</em> eingehender Cookies
   aus Sicherheitsgründen nicht mehr URL-dekodiert.
  </p>
 </div>

</div><?php manual_footer($setup); ?>