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

contributors($setup);

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

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

  <div class="sect3" id="migration83.incompatible.core.overflowing-call-stack">

   <h4 class="title">Programme, die beinahe zum Stapelüberlauf geführt hätten</h4>
   <p class="para">
    Programme, die sehr nahe daran waren, einen Überlauf des Aufrufstapels zu
    verursachen, können nun einen <span class="classname"><a href="class.error.php" class="classname">Error</a></span> werfen, wenn
    sie mehr als
    zend.max_allowed_stack_size-zend.reserved_stack_size
    Bytes des Stapels verwenden
    (fiber.stack_size-zend.reserved_stack_size
    bei Fibers).
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.proc-get-status-multiple-times">
   <h4 class="title">Mehrmaliges Ausführen von proc_get_status()</h4>
   <p class="para">
    Die Funktion <span class="function"><a href="function.proc-get-status.php" class="function">proc_get_status()</a></span> gibt auf POSIX-Systemen
    nun immer den richtigen Wert zurück, wenn sie mehrfach ausgeführt wird.
    Zuvor lieferte nur der erste Aufruf den richtigen Wert. Auch
    <span class="function"><a href="function.proc-close.php" class="function">proc_close()</a></span> gibt nun den richtigen Exit-Code zurück,
    wenn es nach <span class="function"><a href="function.proc-get-status.php" class="function">proc_get_status()</a></span> ausgeführt wird. Zuvor
    wurde in diesem Fall <code class="literal">-1</code> zurückgegeben. Intern
    funktioniert dies, indem das Ergebnis auf POSIX-Systemen
    zwischengespeichert wird. Wenn das vorherige Verhalten benötigt wird, kann
    der Schlüssel <code class="literal">&quot;cached&quot;</code> in dem von
    <span class="function"><a href="function.proc-get-status.php" class="function">proc_get_status()</a></span> zurückgegebenen Array überprüft
    werden, um zu sehen, ob das Ergebnis zwischengespeichert wurde.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.zend-max-execution-timers">
   <h4 class="title">Zend-Timer für die maximale Ausführungsdauer</h4>
   <p class="para">
    Die Zend-Timer für die maximale Ausführungsdauer (Zend Max Execution
    Timers) sind nun standardmäßig für ZTS-Builds unter Linux aktiviert.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.traits-with-static-properties">
   <h4 class="title">Verwendung von Traits mit statischen Eigenschaften</h4>
   <p class="para">
    Wenn Traits mit statischen Eigenschaften verwendet werden, werden nun die
    von der Elternklasse geerbten statischen Eigenschaften neu deklariert.
    Dadurch wird für die aktuelle Klasse ein separater Speicher für statische
    Eigenschaften angelegt. Dies ist vergleichbar mit dem direkten Hinzufügen
    statischer Eigenschaften zur Klasse ohne Traits.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.negative-index-to-empty-array">
   <h4 class="title">Zuweisung eines negativen Indexes an ein leeres Array</h4>
   <p class="para">
    Wenn einem leeren Array ein negativer Index <var class="varname">$n</var>
    zugewiesen wird, ist der nächste Index nun immer <code class="code">$n+1</code>
    anstelle von <code class="literal">0</code>.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.class-constant-visibility-check">
   <h4 class="title">Überprüfung von Klassenkonstanten auf Sichtbarkeitsabweichungen</h4>
   <p class="para">
    Wenn eine Klassenkonstante von einer Schnittstelle geerbt wird, wird diese
    nun korrekt auf Abweichung bei der Sichtbarkeit geprüft.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.weakmap-entries-maps-to-itself">
   <h4 class="title">WeakMap-Einträge, deren Schlüssel auf sich selbst verweisen</h4>
   <p class="para">
    Wenn der Schlüssel eines <span class="classname"><a href="class.weakmap.php" class="classname">WeakMap</a></span>-Eintrags auf sich
    selbst verweist (möglicherweise transitiv) und nur durch Iteration über
    die WeakMap erreichbar ist (die Erreichbarkeit durch Iteration wird als
    schwach angesehen), kann dieser Eintrag nun während der Sammlung von Zyklen
    entfernt werden. Zuvor wurden solche Einträge nie automatisch entfernt.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration83.incompatible.date">
  <h3 class="title">Date</h3>

  <p class="para">
   Für die DateTime-Erweiterung wurden unter den Hierarchien
   <span class="classname"><a href="class.dateerror.php" class="classname">DateError</a></span> und <span class="classname"><a href="class.dateexception.php" class="classname">DateException</a></span>
   erweiterungsspezifische Fehler und Exceptions eingeführt, die Warnungen und
   generische Exceptions ersetzen. Dies verbessert die Fehlerbehandlung,
   erfordert aber eine Überprüfung auf Fehler und Exceptions.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.dom">
  <h3 class="title">DOM</h3>

  <p class="para">
   Der Aufruf von <span class="methodname"><a href="domchildnode.after.php" class="methodname">DOMChildNode::after()</a></span>,
   <span class="methodname"><a href="domchildnode.before.php" class="methodname">DOMChildNode::before()</a></span> und
   <span class="methodname"><a href="domchildnode.replacewith.php" class="methodname">DOMChildNode::replaceWith()</a></span> auf einem Knoten, der
   kein Elternteil hat, ist nun eine Nulloperation (bewirkt nichts), anstatt
   eine Hierarchie-Exception zu werfen, was dem von der DOM-Spezifikation
   geforderten Verhalten entspricht.
  </p>

  <p class="para">
   Die Methoden <span class="classname"><a href="class.domparentnode.php" class="classname">DOMParentNode</a></span> und
   <span class="classname"><a href="class.domchildnode.php" class="classname">DOMChildNode</a></span> können nun auch ohne ein Dokument
   verwendet werden, ohne dass eine
   <strong><code><a href="dom.constants.php#constant.dom-hierarchy-request-err">DOM_HIERARCHY_REQUEST_ERR</a></code></strong>-<span class="classname"><a href="class.domexception.php" class="classname">DOMException</a></span>
   geworfen wird. Dies entspricht dem von der DOM-Spezifikation geforderten
   Verhalten.
  </p>

  <p class="para">
   Wenn <span class="methodname"><a href="domdocument.createattributens.php" class="methodname">DOMDocument::createAttributeNS()</a></span> ohne die
   Angabe eines Präfixes aufgerufen wurde, wurde fälschlicherweise ein
   Standard-Namensraum erstellt und das Element in den Namensraum statt in das
   Attribut eingefügt. Dieser Fehler ist nun behoben.
  </p>

  <p class="para">
   Wenn ein Präfix bereits für einen anderen URI verwendet wurde, hat
   <span class="methodname"><a href="domdocument.createattributens.php" class="methodname">DOMDocument::createAttributeNS()</a></span> bisher
   fälschlicherweise eine
   <strong><code>DOM_NAMESPACE_ERRNAMESPACE_ERR</code></strong>-<span class="classname"><a href="class.domexception.php" class="classname">DOMException</a></span>
   geworfen. Nun wird bei einem Konflikt mit dem Präfixnamen korrekterweise
   ein anderes Präfix gewählt.
  </p>

  <p class="para">
   Zu einigen DOM-Klassen wurden neue Methoden und Eigenschaften hinzugefügt.
   Wenn eine benutzerdefinierte Klasse von diesen Klassen erbt und eine
   Methode oder Eigenschaft mit dem gleichen Namen deklariert, müssen die
   Deklarationen kompatibel sein. Andernfalls führt dies zu einem typischen
   Kompilierfehler wegen inkompatibler Deklarationen. Informationen über die
   neu implementierten Methoden und Eigenschaften sind in den Listen der
   <a href="migration83.new-features.php#migration83.new-features.dom" class="link">neuen Features</a> und
   <a href="migration83.new-functions.php#migration83.new-functions.dom" class="link">neuen Funktionen</a> zu
   finden.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.ffi">
  <h3 class="title">FFI</h3>

  <p class="para">
   C-Funktionen, die den Rückgabetyp <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span> haben, geben nun <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>
   anstelle des Objekts <code class="literal">object(FFI\CData:void) { }</code> zurück
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.opcache">
  <h3 class="title">Opcache</h3>

  <p class="para">
   Die INI-Direktive
   <a href="opcache.configuration.php#ini.opcache.consistency-checks" class="link">opcache.consistency_checks</a>
   wurde entfernt. Dieses Feature war sowohl in Verbindung mit dem Tracing-JIT
   als auch mit dem Vererbungscache defekt und ist seit PHP 8.1.18 und
   PHP 8.2.5 deaktiviert, ohne dass es eine Möglichkeit gibt, es zu aktivieren.
   Sowohl das Tracing-JIT als auch der Vererbungscache können den gemeinsamen
   Speicher (shm) verändern, nachdem das Skript persistent gemacht wurde, indem
   sie seine Prüfsumme ungültig machen. Die geplante Korrektur sah vor, die
   veränderbaren Zeiger zu überspringen, wurde aber aufgrund der Komplexität
   verworfen. Daher wurde stattdessen beschlossen, diese Funktion zu entfernen.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.phar">
  <h3 class="title">Phar</h3>

  <p class="para">
   Der Typ der <span class="classname"><a href="class.phar.php" class="classname">Phar</a></span>-Klassenkonstanten wird nun deklariert.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.standard">
  <h3 class="title">Standard</h3>

  <p class="para">
   An der Funktion <span class="function"><a href="function.range.php" class="function">range()</a></span> wurden mehrere Änderungen
   vorgenommen:
   <ul class="simplelist">
    <li>
     Wenn <span class="type">Objekt</span>e, <span class="type">Ressource</span>n oder
     <span class="type"><a href="language.types.array.php" class="type Array">Array</a></span>s als begrenzende Werte übergeben werden, wird nun ein
     <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> geworfen.
    </li>
    <li>
     Wenn für <code class="parameter">$step</code> <code class="literal">0</code> übergeben
     wird, wird ein aussagekräftigerer <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>
     geworfen.
    </li>
    <li>
     Wenn ein negativer von <code class="parameter">$step</code> für steigende
     Bereiche verwendet wird, wird nun ein <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>
     geworfen.
    </li>
    <li>
     Wenn <code class="parameter">$step</code> eine Gleitkommazahl ist, die als
     Ganzzahl interpretiert werden kann, wird sie nun als solche behandelt.
    </li>
    <li>
     Wenn ein Argument unendlich oder NAN ist, wird nun ein
     <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> geworfen.
    </li>
    <li>
     Wenn <code class="parameter">$start</code> oder <code class="parameter">$end</code> eine
     leere Zeichenkette ist, wird nun ein <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>
     ausgegeben. Der Wert wird weiterhin in den Wert <code class="literal">0</code>
     umgewandelt.
    </li>
    <li>
     Wenn <code class="parameter">start</code> oder <code class="parameter">end</code> eine
     nicht-numerische Zeichenkette mit mehr als einem Byte ist, wird nun ein
     <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> ausgegeben.
    </li>
    <li>
     Wenn <code class="parameter">start</code> oder <code class="parameter">end</code> eine
     Zeichenkette ist, die implizit in eine Ganzzahl umgewandelt wird, weil
     der andere begrenzende Werte eine Zahl ist (z. B.
     <code class="code">range(5, &#039;z&#039;);</code>), wird nun ein <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>
     ausgegeben.
    </li>
    <li>
     Wenn <code class="parameter">$step</code> eine Gleitkommazahl ist, wird nun ein
     <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> ausgegeben, wenn versucht wird, einen
     Bereich von Zeichen zu erzeugen, es sei denn, beide begrenzenden Werte
     sind numerische Zeichenketten (z. B. verursacht
     <code class="code">range(&#039;5&#039;, &#039;9&#039;, 0.5);</code> keine Warnung).
    </li>
    <li>
     Wenn einer der begrenzenden Werte eine Ziffer in Form einer Zeichenkette
     ist (z. B. <code class="code">range(&#039;9&#039;, &#039;A&#039;);</code>), erzeugt
     <span class="function"><a href="function.range.php" class="function">range()</a></span> nun eine Liste von Zeichen, anstatt den
     anderen Wert in eine Ganzzahl umzuwandeln.
    </li>
   </ul>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />range</span><span style="color: #007700">(</span><span style="color: #DD0000">'9'</span><span style="color: #007700">, </span><span style="color: #DD0000">'A'</span><span style="color: #007700">);  </span><span style="color: #FF8000">// ["9", ":", ";", "&lt;", "=", "&gt;", "?", "@", "A"], seit PHP 8.3.0<br /></span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #DD0000">'9'</span><span style="color: #007700">, </span><span style="color: #DD0000">'A'</span><span style="color: #007700">);  </span><span style="color: #FF8000">// [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], vor PHP 8.3.0<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>

  <p class="para">
   Die Funktion <span class="function"><a href="function.number-format.php" class="function">number_format()</a></span> verarbeitet nun negative
   <code class="parameter">$decimals</code>-Werte, indem <code class="parameter">$num</code>
   auf <code class="code">abs($decimals)</code> Ziffern vor dem Dezimaltrennzeichen
   gerundet wird; zuvor wurden negative <code class="parameter">$decimals</code>-Werte
   ignoriert.
  </p>

  <p class="para">
   Die Flags-Fehlerprüfung der Funktion <span class="function"><a href="function.file.php" class="function">file()</a></span> fängt nun
   alle ungültigen Flags ab. Insbesondere <strong><code><a href="filesystem.constants.php#constant.file-append">FILE_APPEND</a></code></strong>
   wurde bisher stillschweigend akzeptiert.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.SNMP">
  <h3 class="title">SNMP</h3>

  <p class="para">
   Der Typ der <span class="classname"><a href="class.snmp.php" class="classname">SNMP</a></span>-Klassenkonstanten wird nun deklariert.
  </p>
 </div>

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