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

contributors($setup);

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

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

  <div class="sect3" id="migration80.incompatible.core.string-number-comparision">
   <h4 class="title">Vergleich zwischen Zeichenketten und Zahlen</h4>

   <p class="para">
    Einfache (nicht-strikte) Vergleiche zwischen Zahlen und nicht-numerischen
    Zeichenketten erfolgen nun durch Umwandlung der Zahl in eine Zeichenkette
    und den Vergleich der Zeichenketten. Vergleiche zwischen Zahlen und
    numerischen Zeichenketten funktionieren weiterhin wie bisher. Insbesondere
    bedeutet dies, dass <code class="code">0 == &quot;keine Zahl&quot;</code> nun als falsch
    angesehen wird.
    <table class="doctable informaltable">
     
      <thead>
       <tr>
        <th>Vergleich</th>
        <th>Vor der Änderung</th>
        <th>Nach der Änderung</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td><code class="code">0 == &quot;0&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;0.0&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;foo&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">42 == &quot;   42&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">42 == &quot;42foo&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

      </tbody>
     
    </table>

    
   </p>
  </div>

  <div class="sect3" id="migration80.incompatible.core.other">
   <h4 class="title">Andere inkompatible Änderungen</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      <code class="literal">match</code> ist nun ein reserviertes Schlüsselwort.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">mixed</code> ist nun ein reserviertes Wort, kann also nicht zur Benennung einer Klasse, Schnittstelle oder eines Traits verwendet werden und darf auch nicht in Namespaces verwendet werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Assertion-Fehler werden nun standardmäßig ausgelöst. Wenn das alte
      Verhalten gewünscht wird, kann in den INI-Einstellungen
      <code class="code">assert.exception=0</code> gesetzt werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Methoden mit dem gleichen Namen wie die Klasse werden nicht mehr als
      Konstruktoren interpretiert. Stattdessen sollte die Methode
      <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> verwendet werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Möglichkeit, nicht-statische Methoden statisch aufzurufen, wurde
      entfernt. Deshalb schlägt <span class="function"><a href="function.is-callable.php" class="function">is_callable()</a></span> fehl, wenn
      eine nicht-statische Methode mit einem Klassennamen geprüft wird (muss
      mit einer Objektinstanz überprüft werden).
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Typumwandlungen <code class="code">(real)</code> und <code class="code">(unset)</code> wurden
      entfernt.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die INI-Direktive <a href="errorfunc.configuration.php#ini.track-errors" class="link">track_errors</a>
      wurde entfernt. Das bedeutet, dass <var class="varname">php_errormsg</var> nicht
      mehr verfügbar ist. Stattdessen kann die Funktion
      <span class="function"><a href="function.error-get-last.php" class="function">error_get_last()</a></span> verwendet werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Möglichkeit, Konstanten ohne Berücksichtigung der Groß- und
      Kleinschreibung zu definieren, wurde entfernt. Das dritte Argument von
      <span class="function"><a href="function.define.php" class="function">define()</a></span> kann nicht mehr <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> sein.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Möglichkeit, einen Autoloader mit einer
      <span class="function"><a href="function.autoload.php" class="function">__autoload()</a></span>-Funktion anzugeben, wurde entfernt.
      Stattdessen sollte <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> verwendet
      werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Der Parameter <code class="parameter">errcontext</code> wird nicht mehr an
      benutzerdefinierte Fehlerbehandlungen übergeben, die mit der Funktion
      <span class="function"><a href="function.set-error-handler.php" class="function">set_error_handler()</a></span> gesetzt wurden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Funktion <span class="function"><a href="function.create-function.php" class="function">create_function()</a></span> wurde entfernt.
      Stattdessen können anonyme Funktionen verwendet werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Funktion <span class="function"><a href="function.each.php" class="function">each()</a></span> wurde entfernt. Stattdessen
      sollte <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> oder <span class="classname"><a href="class.arrayiterator.php" class="classname">ArrayIterator</a></span> verwendet
      werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Möglichkeit, die Bindung von <var class="varname">this</var> an Closures
      aufzuheben, die mittels <span class="methodname"><a href="closure.fromcallable.php" class="methodname">Closure::fromCallable()</a></span>
      oder <span class="methodname"><a href="reflectionmethod.getclosure.php" class="methodname">ReflectionMethod::getClosure()</a></span> aus einer
      Methode erzeugt wurden, wurde entfernt.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Möglichkeit, die Bindung von <var class="varname">this</var> an echte
      Closures aufzuheben, die <var class="varname">this</var> verwenden, wurde
      ebenfalls entfernt.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Möglichkeit, die Funktion <span class="function"><a href="function.array-key-exists.php" class="function">array_key_exists()</a></span> mit
      Objekten zu verwenden, wurde entfernt. Stattdessen können
      <span class="function"><a href="function.isset.php" class="function">isset()</a></span> oder <span class="function"><a href="function.property-exists.php" class="function">property_exists()</a></span>
      verwendet werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Das Verhalten der Funktion <span class="function"><a href="function.array-key-exists.php" class="function">array_key_exists()</a></span>
      entspricht bezüglich des Typs des Parameters <code class="parameter">key</code>
      nun dem Verhalten der Funktion <span class="function"><a href="function.isset.php" class="function">isset()</a></span> und dem
      normalen Array-Zugriff. Alle Schlüsseltypen unterliegen nun den üblichen
      Einschränkungen und Array- und Objektschlüssel lösen einen
      <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> aus.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Jedes Array, das eine Zahl <span class="replaceable">n</span> als ersten
      numerischen Schlüssel hat, verwendet <span class="replaceable">n+1</span> für
      seinen nächsten impliziten Schlüssel, auch wenn
      <span class="replaceable">n</span> negativ ist.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die voreingestellte Stufe von error_reporting ist nun
      <strong><code><a href="errorfunc.constants.php#constant.e-all">E_ALL</a></code></strong>; zuvor waren <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong>
      und <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong> ausgeschlossen.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <a href="errorfunc.configuration.php#ini.display-startup-errors" class="link">display_startup_errors</a>
      ist nun standardmäßig aktiviert.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Verwendung von <span class="type">parent</span> innerhalb einer Klasse, die keine
      übergeordnete Klasse hat, führt nun bei der Kompilierung zu einem
      schweren Fehler.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Der Operator <code class="literal">@</code> unterdrückt nun keine schweren Fehler
      (<strong><code><a href="errorfunc.constants.php#constant.e-error">E_ERROR</a></code></strong>, <strong><code><a href="errorfunc.constants.php#constant.e-core-error">E_CORE_ERROR</a></code></strong>,
      <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>, <strong><code><a href="errorfunc.constants.php#constant.e-user-error">E_USER_ERROR</a></code></strong>,
      <strong><code><a href="errorfunc.constants.php#constant.e-recoverable-error">E_RECOVERABLE_ERROR</a></code></strong> und
      <strong><code><a href="errorfunc.constants.php#constant.e-parse">E_PARSE</a></code></strong>) mehr. Error-Handler, die erwarten, dass
      error_reporting <code class="literal">0</code> ist, wenn <code class="literal">@</code>
      verwendet wird, sollten so angepasst werden, dass sie stattdessen die
      Fehler-Maske prüfen:
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Dies ersetzen<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_error_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$err_no</span><span style="color: #007700">, </span><span style="color: #0000BB">$err_msg</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$linenum</span><span style="color: #007700">) {<br />    if (</span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">() == </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />        return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />    }<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// mit Folgendem<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_error_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$err_no</span><span style="color: #007700">, </span><span style="color: #0000BB">$err_msg</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$linenum</span><span style="color: #007700">) {<br />    if (!(</span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">() &amp; </span><span style="color: #0000BB">$err_no</span><span style="color: #007700">)) {<br />        return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />    }<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Darüber hinaus sollte in Produktivumgebungen darauf geachtet werden,
      dass keine Fehlermeldungen angezeigt werden, da dies zu
      Informationslecks führen kann. Es sollte sichergestellt werden, dass in
      Verbindung mit der Fehleraufzeichnung <code class="code">display_errors=Off</code>
      verwendet wird.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">#[</code> wird nicht mehr als Beginn eines Kommentars
      interpretiert, weil diese Syntax nun für Attribute verwendet wird.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Vererbungsfehler aufgrund von inkompatiblen Methodensignaturen
      (Verletzung des Liskovschen Substitutionsprinzip, LSP) führen nun immer
      zu einem schweren Fehler. Vorher wurde in manchen Fällen eine Warnung
      erzeugt.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Rangfolge des Verkettungsoperators hat sich gegenüber
      Bitverschiebungen sowie Addition und Subtraktion geändert.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Summe: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// wurde früher wie folgt interpretiert:<br /></span><span style="color: #007700">echo (</span><span style="color: #DD0000">"Summe: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$a</span><span style="color: #007700">) + </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// wird nun interpretiert als:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Summe: " </span><span style="color: #007700">. (</span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ein Parameter mit einem Standardwert, der bei der Ausführung zu <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>
      aufgelöst wird, wird nicht mehr implizit als nullbarer Parameter
      gekennzeichnet. Stattdessen muss explizit entweder ein nullbarer Typ
      oder der Standardwert <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> verwendet werden.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Dies ersetzen<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">CONST_RESOLVING_TO_NULL</span><span style="color: #007700">) {}<br /></span><span style="color: #FF8000">// mit<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(?</span><span style="color: #0000BB">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">CONST_RESOLVING_TO_NULL</span><span style="color: #007700">) {}<br /></span><span style="color: #FF8000">// oder<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Einige Warnungen wurden in <span class="classname"><a href="class.error.php" class="classname">Error</a></span>-Exceptions
      umgewandelt:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>
        Der Versuch, in eine Eigenschaft eines Nicht-Objekts zu schreiben.
        Zuvor wurde dadurch implizit ein stdClass-Objekt für null, false und
        leere Zeichenketten erstellt.
       </li>
       <li>
        Der Versuch, ein Element an ein Array anzuhängen, für das bereits der
        Schlüssel PHP_INT_MAX verwendet wird.
       </li>
       <li>
        Der Versuch, einen ungültigen Typ (Array oder Objekt) als
        Array-Schlüssel oder Zeichenketten-Offset zu verwenden.
       </li>
       <li>
        Der Versuch, in einen Array-Index eines skalaren Wertes zu schreiben.
       </li>
       <li>Der Versuch, ein Nicht-Array/Traversable zu entpacken.</li>
       <li>
        Der Versuch, auf unqualifizierte Konstanten zuzugreifen, die nicht
        definiert sind. Zuvor führten Zugriffe auf unqualifizierte Konstanten
        zu einer Warnung und wurden als Zeichenketten interpretiert.
       </li>
       <li>
        Wenn die falsche Anzahl von Argumenten an eine interne Funktion
        übergeben wird, die keinen Parameter mit variabler Länge hat, wird ein
        <span class="classname"><a href="class.argumentcounterror.php" class="classname">ArgumentCountError</a></span> geworfen.
       </li>
       <li>
        Wenn ungültige zählbare Typen an <span class="function"><a href="function.count.php" class="function">count()</a></span> übergeben
        werden, wird ein <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> geworfen.
       </li>
      </ul>
     </p>
     <p class="para">
      Einige Hinweise wurden in Warnungen umgewandelt:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>Der Versuch, eine undefinierte Variable zu lesen.</li>
       <li>Der Versuch, eine undefinierte Eigenschaft zu lesen.</li>
       <li>Der Versuch, einen undefinierten Array-Schlüssel zu lesen.</li>
       <li>Der Versuch, eine Eigenschaft eines Nicht-Objekts zu lesen.</li>
       <li>
        Der Versuch, auf einen Array-Index eines Nicht-Arrays zuzugreifen.
       </li>
       <li>Der Versuch, ein Array in eine Zeichenkette zu konvertieren.</li>
       <li>Der Versuch, eine Ressource als Array-Schlüssel zu verwenden.</li>
       <li>
        Der Versuch, null, einen Boolean oder einen Float als
        Zeichenketten-Offset zu verwenden.
       </li>
       <li>
        Der Versuch, einen Zeichenketten-Offset zu lesen, der außerhalb des
        zulässigen Bereichs liegt.
       </li>
       <li>
        Der Versuch, einem Zeichenketten-Offset eine leere Zeichenkette
        zuzuweisen.
       </li>
      </ul>
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Der Versuch, einem Zeichenketten-Offset mehrere Bytes zuzuweisen, führt
      nun zu einer Warnung.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Unerwartete Zeichen in Quelldateien (z. B. NUL-Bytes außerhalb von
      Zeichenketten) führen nun statt zu einer Warnung beim Kompilieren zu
      einer <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span>-Exception.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Nicht abgefangene Exceptions durchlaufen nun einen &quot;sauberen Shutdown&quot;,
      was bedeutet, dass nach einer nicht abgefangenen Exception die
      Destruktoren aufgerufen werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Der bei der Kompilierung auftretende schwere Fehler &quot;Only variables can
      be passed by reference&quot; wurde in die Laufzeit verschoben und in die
      <span class="classname"><a href="class.error.php" class="classname">Error</a></span>-Exception &quot;Argument cannot be passed by
      reference&quot; umgewandelt.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Einige &quot;Only variables should be passed by reference&quot;-Hinweise wurden
      in die Exception &quot;Argument cannot be passed by reference&quot; umgewandelt.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Der für anonyme Klassen erzeugte Name hat sich geändert. Er enthält nun
      den Namen des ersten Elternteils oder der ersten Schnittstelle:
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">new class extends </span><span style="color: #0000BB">ParentClass </span><span style="color: #007700">{};<br /></span><span style="color: #FF8000">// -&gt; ParentClass@anonymous<br /></span><span style="color: #007700">new class implements </span><span style="color: #0000BB">FirstInterface</span><span style="color: #007700">, </span><span style="color: #0000BB">SecondInterface </span><span style="color: #007700">{};<br /></span><span style="color: #FF8000">// -&gt; FirstInterface@anonymous<br /></span><span style="color: #007700">new class {};<br /></span><span style="color: #FF8000">// -&gt; class@anonymous<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Auf den oben gezeigten Namen folgen noch ein NUL-Byte und ein
      eindeutiges Suffix.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Verweise auf nicht-absolute Trait-Methoden in Anpassungen von
      Trait-Aliasen müssen nun eindeutig sein:
     </p>
     <p class="para">
      <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">X </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">T1</span><span style="color: #007700">, </span><span style="color: #0000BB">T2 </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">func </span><span style="color: #007700">as </span><span style="color: #0000BB">otherFunc</span><span style="color: #007700">;<br />    }<br />    function </span><span style="color: #0000BB">func</span><span style="color: #007700">() {}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Wenn sowohl <code class="code">T1::func()</code> als auch <code class="code">T2::func()</code>
      existieren, wurde dieser Code bisher stillschweigend akzeptiert, und es
      wurde angenommen, dass func sich auf <code class="code">T1::func</code> bezieht. Nun
      erzeugt er stattdessen einen schweren Fehler und es muss explizit
      entweder <code class="code">T1::func</code> oder <code class="code">T2::func</code> geschrieben
      werden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Signatur von abstrakten Methoden, die in Traits definiert sind, wird
      nun anhand der Methode der implementierenden Klasse überprüft:
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">trait </span><span style="color: #0000BB">MyTrait </span><span style="color: #007700">{<br />    abstract private function </span><span style="color: #0000BB">neededByTrait</span><span style="color: #007700">(): </span><span style="color: #0000BB">string</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">MyTrait</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Fehler, da der Rückgabetyp nicht übereinstimmt.<br />    </span><span style="color: #007700">private function </span><span style="color: #0000BB">neededByTrait</span><span style="color: #007700">(): </span><span style="color: #0000BB">int </span><span style="color: #007700">{ return </span><span style="color: #0000BB">42</span><span style="color: #007700">; }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Deaktivierte Funktionen werden nun genauso behandelt wie nicht
      existierende Funktionen. Wenn eine deaktivierte Funktion aufgerufen
      wird, wird sie als unbekannt gemeldet, und es ist nun möglich, eine
      deaktivierte Funktion neu zu definieren.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">data://</code>-Stream-Wrapper sind nicht mehr beschreibbar,
      was dem dokumentierten Verhalten entspricht.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die arithmetischen und bitweisen Operatoren <code class="literal">+</code>,
      <code class="literal">-</code>, <code class="literal">*</code>, <code class="literal">/</code>,
      <code class="literal">**</code>, <code class="literal">%</code>,
      <code class="literal">&lt;&lt;</code>, <code class="literal">&gt;&gt;</code>,
      <code class="literal">&amp;</code>, <code class="literal">|</code>, <code class="literal">^</code>,
      <code class="literal">~</code>, <code class="literal">++</code> und <code class="literal">--</code>
      lösen nun ausnahmslos einen <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> aus, wenn
      einer der der Operanden ein <a href="language.types.array.php" class="link">Array</a>, eine <a href="language.types.resource.php" class="link">Ressource</a> oder ein nicht
      überladenes <a href="language.types.object.php" class="link">Objekt</a> ist. Die einzige Ausnahme hiervon ist die
      Array-Zusammenführung Array <code class="literal">+</code> Array, die weiterhin
      unterstützt wird.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Umwandlung vom Typ Float in den Typ String erfolgt nun immer
      unabhängig von der Locale.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />setlocale</span><span style="color: #007700">(</span><span style="color: #0000BB">LC_ALL</span><span style="color: #007700">, </span><span style="color: #DD0000">"de_DE"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$f </span><span style="color: #007700">= </span><span style="color: #0000BB">3.14</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$f</span><span style="color: #007700">, </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Vorher: 3,14<br />// Jetzt:  3.14<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Siehe <span class="function"><a href="function.printf.php" class="function">printf()</a></span>, <span class="function"><a href="function.number-format.php" class="function">number_format()</a></span>
      und <span class="methodname"><strong>NumberFormatter()</strong></span> für Möglichkeiten, die
      Formatierung von Zahlen anzupassen.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Unterstützung für die veraltete Verwendung von geschweiften Klammern
      für den Offset-Zugriff wurde entfernt.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Anstelle von:<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">{</span><span style="color: #0000BB">0</span><span style="color: #007700">};<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">{</span><span style="color: #DD0000">"key"</span><span style="color: #007700">};<br /></span><span style="color: #FF8000">// schreiben Sie:<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"key"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Wenn der final-Modifikator auf eine private Methode angewendet wird,
      wird nun eine Warnung erzeugt, es sei denn, die Methode ist der
      Konstruktor.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Wenn im Konstruktor eines Objekts <span class="function"><a href="function.exit.php" class="function">exit()</a></span> aufgerufen
      wird, wird der Destruktor des Objekts nicht mehr aufgerufen. Dies
      entspricht dem Verhalten, wenn ein Konstruktor eine Exception auslöst.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Namen mit Bezug auf einen Namensraum dürfen keine Leerzeichen mehr
      enthalten: Während <code class="code">Foo\Bar</code> als Namensraum-Name erkannt
      wird, wird <code class="code">Foo \ Bar</code> nicht erkannt. Umgekehrt sind
      reservierte Schlüsselwörter nun als Namensraumsegmente erlaubt, was auch
      die Interpretation des Codes verändern kann: <code class="code">new\x</code> ist nun
      gleichbedeutend mit <code class="code">constant(&#039;new\x&#039;)</code>, nicht mit
      <code class="code">new \x()</code>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Verschachtelte ternäre Ausdrücke müssen nun explizit in Klammern gesetzt
      werden.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Funktionen <span class="function"><a href="function.debug-backtrace.php" class="function">debug_backtrace()</a></span> und
      <span class="methodname"><a href="exception.gettrace.php" class="methodname">Exception::getTrace()</a></span> referenzieren nun keine
      Parameter mehr. Es ist nicht mehr möglich, über einen Backtrace die
      Parameter einer Funktion zu ändern.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Handhabung numerischer Zeichenketten wurde geändert, damit sie
      intuitiver und weniger fehleranfällig ist. Nachfolgende Leerzeichen sind
      nun in numerischen Zeichenketten erlaubt, um mit der Behandlung von
      führenden Leerzeichen übereinzustimmen. Dies betrifft hauptsächlich:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>Die Funktion <span class="function"><a href="function.is-numeric.php" class="function">is_numeric()</a></span></li>
       <li>Vergleiche zwischen Zeichenketten</li>
       <li>Typdeklarationen</li>
       <li>Inkrement- und Dekrement-Operationen</li>
      </ul>
     </p>
     <p class="para">
      Das Konzept einer &quot;vorangestellten numerischen Zeichenkette&quot; wurde
      größtenteils aufgegeben; die Fälle, in denen dies beibehalten wird,
      dienen dazu, die Umstellung zu erleichtern. Zeichenketten, die eine
      <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> &quot;A non well-formed numeric value
      encountered&quot; ausgaben, geben nun eine <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;A
      non-numeric value encountered&quot; aus, und alle Zeichenketten, die eine
      <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;A non-numeric value encountered&quot;
      ausgaben, lösen nun einen <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> aus. Dies
      betrifft vor allem:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>Arithmetische Operationen</li>
       <li>Bitweise Operationen</li>
      </ul>
     </p>
     <p class="para">
      Diese Änderung von <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> zu
      <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> betrifft auch die
      <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;Illegal string offset &#039;string&#039;&quot; für
      unzulässige Zeichenketten-Offsets. Das Verhalten von expliziten
      Umwandlungen von Zeichenketten in int/float hat sich nicht geändert.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Magische Methoden werden nun auf ihre Parameter und Rückgabetypen
      geprüft, falls sie diese deklariert haben. Die Signaturen sollten der
      folgenden Liste entsprechen:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li><code class="code">__call(string $name, array $arguments): mixed</code></li>
       <li><code class="code">__callStatic(string $name, array $arguments): mixed</code></li>
       <li><code class="code">__clone(): void</code></li>
       <li><code class="code">__debugInfo(): ?array</code></li>
       <li><code class="code">__get(string $name): mixed</code></li>
       <li><code class="code">__invoke(mixed $arguments): mixed</code></li>
       <li><code class="code">__isset(string $name): bool</code></li>
       <li><code class="code">__serialize(): array</code></li>
       <li><code class="code">__set(string $name, mixed $value): void</code></li>
       <li><code class="code">__set_state(array $properties): object</code></li>
       <li><code class="code">__sleep(): array</code></li>
       <li><code class="code">__unserialize(array $data): void</code></li>
       <li><code class="code">__unset(string $name): void</code></li>
       <li><code class="code">__wakeup(): void</code></li>
      </ul>
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Array-Schlüssel, die an die Funktion
      <span class="function"><a href="function.call-user-func-array.php" class="function">call_user_func_array()</a></span> übergeben werden, werden nun
      als Namen der Parameter interpretiert. In früheren Versionen wurden sie
      stillschweigend ignoriert.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Deklaration einer Funktion namens <code class="literal">assert()</code>
      innerhalb eines Namensraums ist nicht mehr erlaubt und erzeugt einen
      <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>. Die Funktion
      <span class="function"><a href="function.assert.php" class="function">assert()</a></span> unterliegt einer speziellen Verarbeitung
      durch die Engine, was zu einem inkonsistenten Verhalten führen kann,
      wenn eine Funktion mit demselben Namen innerhalb eines Namensraums
      definiert wird.
     </p>
    </li>
   </ul>
  </div>
 </div>

 <div class="sect2" id="migration80.incompatible.resource2object">
  <h3 class="title">Umstellung von Ressourcen auf Objekte</h3>

  <p class="para">
   Mehrere <a href="language.types.resource.php" class="link">Ressource</a>n wurden in <a href="language.types.object.php" class="link">Objekt</a>e umgewandelt. Die Überprüfung des
   Rückgabewerts mit der Funktion <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> sollte
   durch eine Überprüfung auf <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> ersetzt werden.
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.curl-init.php" class="function">curl_init()</a></span> gibt nun ein
     <span class="classname"><a href="class.curlhandle.php" class="classname">CurlHandle</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a> zurück.
     Die Funktion <span class="function"><a href="function.curl-close.php" class="function">curl_close()</a></span> hat keine Wirkung mehr;
     stattdessen wird die <span class="classname"><a href="class.curlhandle.php" class="classname">CurlHandle</a></span>-Instanz
     automatisch zerstört, wenn sie nicht mehr referenziert wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.curl-multi-init.php" class="function">curl_multi_init()</a></span> gibt nun ein
     <span class="classname"><a href="class.curlmultihandle.php" class="classname">CurlMultiHandle</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück. Die Funktion <span class="function"><a href="function.curl-multi-close.php" class="function">curl_multi_close()</a></span> hat keine
     Wirkung mehr; stattdessen wird die
     <span class="classname"><a href="class.curlmultihandle.php" class="classname">CurlMultiHandle</a></span>-Instanz automatisch zerstört,
     wenn sie nicht mehr referenziert wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.curl-share-init.php" class="function">curl_share_init()</a></span> gibt nun ein
     <span class="classname"><a href="class.curlsharehandle.php" class="classname">CurlShareHandle</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück. Die Funktion <span class="function"><a href="function.curl-share-close.php" class="function">curl_share_close()</a></span> hat keine
     Wirkung mehr; stattdessen wird die
     <span class="classname"><a href="class.curlsharehandle.php" class="classname">CurlShareHandle</a></span>-Instanz automatisch zerstört,
     wenn sie nicht mehr referenziert wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.enchant-broker-init.php" class="function">enchant_broker_init()</a></span> gibt nun ein
     <span class="classname"><a href="class.enchantbroker.php" class="classname">EnchantBroker</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.enchant-broker-request-dict.php" class="function">enchant_broker_request_dict()</a></span> und
     <span class="function"><a href="function.enchant-broker-request-pwl-dict.php" class="function">enchant_broker_request_pwl_dict()</a></span> geben nun ein
     <span class="classname"><a href="class.enchantdictionary.php" class="classname">EnchantDictionary</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Erweiterung GD verwendet nun <span class="classname"><a href="class.gdimage.php" class="classname">GdImage</a></span>-Objekte
     statt <a href="language.types.resource.php" class="link">Ressource</a>n als zugrundeliegende Datenstruktur für Bilder. Die
     Funktion <span class="function"><a href="function.imagedestroy.php" class="function">imagedestroy()</a></span> hat keine Wirkung mehr;
     stattdessen wird die <span class="classname"><a href="class.gdimage.php" class="classname">GdImage</a></span>-Instanz automatisch
     zerstört, wenn sie nicht mehr referenziert wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.openssl-x509-read.php" class="function">openssl_x509_read()</a></span> und
     <span class="function"><a href="function.openssl-csr-sign.php" class="function">openssl_csr_sign()</a></span> geben nun ein
     <span class="classname"><a href="class.opensslcertificate.php" class="classname">OpenSSLCertificate</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück. Die Funktion <span class="function"><a href="function.openssl-x509-free.php" class="function">openssl_x509_free()</a></span> ist veraltet
     und hat keine Wirkung mehr; stattdessen wird die
     <span class="classname"><a href="class.opensslcertificate.php" class="classname">OpenSSLCertificate</a></span>-Instanz automatisch zerstört,
     wenn sie nicht mehr referenziert wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.openssl-csr-new.php" class="function">openssl_csr_new()</a></span> gibt nun statt einer
     <a href="language.types.resource.php" class="link">Ressource</a> ein
     <span class="classname"><a href="class.opensslcertificatesigningrequest.php" class="classname">OpenSSLCertificateSigningRequest</a></span>-Objekt zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.openssl-pkey-new.php" class="function">openssl_pkey_new()</a></span> gibt nun ein
     <span class="classname"><a href="class.opensslasymmetrickey.php" class="classname">OpenSSLAsymmetricKey</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück. Die Funktion <span class="function"><a href="function.openssl-pkey-free.php" class="function">openssl_pkey_free()</a></span> ist veraltet
     und hat keine Wirkung mehr; stattdessen wird die
     <span class="classname"><a href="class.opensslasymmetrickey.php" class="classname">OpenSSLAsymmetricKey</a></span>-Instanz automatisch zerstört,
     wenn sie nicht mehr referenziert wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.shmop-open.php" class="function">shmop_open()</a></span> gibt nun ein
     <span class="classname"><a href="class.shmop.php" class="classname">Shmop</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a> zurück. Die
     Funktion <span class="function"><a href="function.shmop-close.php" class="function">shmop_close()</a></span> hat keine Wirkung mehr und ist
     veraltet; stattdessen wird die <span class="classname"><a href="class.shmop.php" class="classname">Shmop</a></span>-Instanz
     automatisch zerstört, wenn sie nicht mehr referenziert wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.socket-create.php" class="function">socket_create()</a></span>,
     <span class="function"><a href="function.socket-create-listen.php" class="function">socket_create_listen()</a></span>,
     <span class="function"><a href="function.socket-accept.php" class="function">socket_accept()</a></span>,
     <span class="function"><a href="function.socket-import-stream.php" class="function">socket_import_stream()</a></span>,
     <span class="function"><a href="function.socket-addrinfo-connect.php" class="function">socket_addrinfo_connect()</a></span>,
     <span class="function"><a href="function.socket-addrinfo-bind.php" class="function">socket_addrinfo_bind()</a></span> und
     <span class="function"><a href="function.socket-wsaprotocol-info-import.php" class="function">socket_wsaprotocol_info_import()</a></span> geben nun ein
     <span class="classname"><a href="class.socket.php" class="classname">Socket</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a> zurück.
     Die Funktion <span class="function"><a href="function.socket-addrinfo-lookup.php" class="function">socket_addrinfo_lookup()</a></span> gibt nun ein
     Array von <span class="classname"><a href="class.addressinfo.php" class="classname">AddressInfo</a></span>-Objekten statt <a href="language.types.resource.php" class="link">Ressource</a>n
     zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.msg-get-queue.php" class="function">msg_get_queue()</a></span> gibt nun ein
     <span class="classname"><a href="class.sysvmessagequeue.php" class="classname">SysvMessageQueue</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.sem-get.php" class="function">sem_get()</a></span> gibt nun ein
     <span class="classname"><a href="class.sysvsemaphore.php" class="classname">SysvSemaphore</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a> zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.shm-attach.php" class="function">shm_attach()</a></span> gibt nun ein
     <span class="classname"><a href="class.sysvsharedmemory.php" class="classname">SysvSharedMemory</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.xml-parser-create.php" class="function">xml_parser_create()</a></span> und
     <span class="function"><a href="function.xml-parser-create-ns.php" class="function">xml_parser_create_ns()</a></span> geben nun ein
     <span class="classname"><a href="class.xmlparser.php" class="classname">XMLParser</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a> zurück.
     Die Funktion <span class="function"><a href="function.xml-parser-free.php" class="function">xml_parser_free()</a></span> hat keine Wirkung mehr;
     stattdessen wird die XMLParser-Instanz automatisch zerstört, wenn sie
     nicht mehr referenziert wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die <a href="book.xmlwriter.php" class="link">XMLWriter</a>-Funktionen
     akzeptieren nun <span class="classname"><a href="class.xmlwriter.php" class="classname">XMLWriter</a></span>-Objekte statt
     <a href="language.types.resource.php" class="link">Ressource</a>n und geben diese zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.inflate-init.php" class="function">inflate_init()</a></span> gibt nun ein
     <span class="classname"><a href="class.inflatecontext.php" class="classname">InflateContext</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.deflate-init.php" class="function">deflate_init()</a></span> gibt nun ein
     <span class="classname"><a href="class.deflatecontext.php" class="classname">DeflateContext</a></span>-Objekt statt einer <a href="language.types.resource.php" class="link">Ressource</a>
     zurück.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.com">
  <h3 class="title">COM und .Net (Windows)</h3>

  <p class="para">
   Die Möglichkeit, Konstanten ohne Berücksichtigung der Groß-/Kleinschreibung
   aus Typbibliotheken zu importieren, wurde entfernt. Das zweite Argument
   der Funktion <span class="function"><a href="function.com-load-typelib.php" class="function">com_load_typelib()</a></span> kann nicht mehr false sein;
   <a href="com.configuration.php#ini.com.autoregister-casesensitive" class="link">com.autoregister_casesensitive</a>
   kann nicht mehr deaktiviert werden. Das bedeutet, dass
   #case_insensitive-Markierungen in
   <a href="com.configuration.php#ini.com.typelib-file" class="link">com.typelib_file</a> ignoriert
   werden.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.curl">
  <h3 class="title">CURL</h3>

  <p class="para">
   <strong><code><a href="curl.constants.php#constant.curlopt-postfields">CURLOPT_POSTFIELDS</a></code></strong> akzeptiert keine Objekte mehr als
   Arrays. Um ein Objekt als Array zu interpretieren, muss eine explizite
   Umwandlung mittels <code class="code">(array)</code> durchgeführt werden. Dasselbe gilt
   auch für andere Optionen, die Arrays akzeptieren.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.datetime">
  <h3 class="title">Datum und Uhrzeit</h3>

  <p class="para">
   Die Funktionen <span class="function"><a href="function.mktime.php" class="function">mktime()</a></span> und
   <span class="function"><a href="function.gmmktime.php" class="function">gmmktime()</a></span> benötigen nun mindestens einen Parameter.
   Die Funktion <span class="function"><a href="function.time.php" class="function">time()</a></span> kann verwendet werden, um den
   aktuellen Zeitstempel zu erhalten.
  </p>
 </div>

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

  <p class="para">
   Nicht implementierte Klassen aus der Erweiterung DOM, die keinerlei
   Funktion hatten und Testdaten enthielten, wurden entfernt. Diese Klassen
   wurden auch aus der neuesten Version des des DOM-Standards entfernt:
  </p>
  <p class="para">
   <ul class="simplelist">
    <li><span class="classname"><strong class="classname">DOMNameList</strong></span></li>
    <li><span class="classname"><strong class="classname">DomImplementationList</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMConfiguration</strong></span></li>
    <li><span class="classname"><strong class="classname">DomError</strong></span></li>
    <li><span class="classname"><strong class="classname">DomErrorHandler</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMImplementationSource</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMLocator</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMUserDataHandler</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMTypeInfo</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMStringExtend</strong></span></li>
   </ul>
  </p>
  <p class="para">
   Nicht implementierte Methoden aus der Erweiterung DOM, die keinerlei
   Funktion hatten, wurden entfernt:
  </p>
  <p class="para">
   <ul class="simplelist">
    <li><span class="methodname"><strong>DOMNamedNodeMap::setNamedItem()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::removeNamedItem()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::setNamedItemNS()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::removeNamedItemNS()</strong></span></li>
    <li><span class="methodname"><strong>DOMText::replaceWholeText()</strong></span></li>
    <li><span class="methodname"><a href="domnode.comparedocumentposition.php" class="methodname">DOMNode::compareDocumentPosition()</a></span></li>
    <li><span class="methodname"><a href="domnode.isequalnode.php" class="methodname">DOMNode::isEqualNode()</a></span></li>
    <li><span class="methodname"><strong>DOMNode::getFeature()</strong></span></li>
    <li><span class="methodname"><strong>DOMNode::setUserData()</strong></span></li>
    <li><span class="methodname"><strong>DOMNode::getUserData()</strong></span></li>
    <li><span class="methodname"><strong>DOMDocument::renameNode()</strong></span></li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.enchant">
  <h3 class="title">Enchant</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.enchant-broker-list-dicts.php" class="function">enchant_broker_list_dicts()</a></span>,
     <span class="function"><a href="function.enchant-broker-describe.php" class="function">enchant_broker_describe()</a></span> und
     <span class="function"><a href="function.enchant-dict-suggest.php" class="function">enchant_dict_suggest()</a></span> geben nun ein leeres
     Array anstelle von <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> zurück.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.exif">
  <h3 class="title">Exif</h3>

  <p class="para">
   Die Funktion <span class="function"><a href="function.read-exif-data.php" class="function">read_exif_data()</a></span> wurde entfernt;
   stattdessen sollte die Funktion <span class="function"><a href="function.exif-read-data.php" class="function">exif_read_data()</a></span>
   verwendet werden.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.filter">
  <h3 class="title">Filter</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Flags <strong><code><a href="filter.constants.php#constant.filter-flag-scheme-required">FILTER_FLAG_SCHEME_REQUIRED</a></code></strong> und
     <strong><code><a href="filter.constants.php#constant.filter-flag-host-required">FILTER_FLAG_HOST_REQUIRED</a></code></strong> für den Filter
     <strong><code><a href="filter.constants.php#constant.filter-validate-url">FILTER_VALIDATE_URL</a></code></strong> wurden entfernt.
     <code class="literal">scheme</code> und <code class="literal">host</code> sind (und waren)
     immer erforderlich.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Konstanten <strong><code><a href="filter.constants.php#constant.input-request">INPUT_REQUEST</a></code></strong> und
     <strong><code><a href="filter.constants.php#constant.input-session">INPUT_SESSION</a></code></strong>, die u. a. für die Funktion
     <span class="function"><a href="function.filter-input.php" class="function">filter_input()</a></span> verwendet wurden, wurden entfernt. Sie
     wurden nie implementiert und ihre Verwendung löste immer eine Warnung aus.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.gd">
  <h3 class="title">GD</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die veraltete Funktion <span class="function"><a href="function.image2wbmp.php" class="function">image2wbmp()</a></span> wurde entfernt.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die veralteten Funktionen <span class="function"><a href="function.png2wbmp.php" class="function">png2wbmp()</a></span> und
     <span class="function"><a href="function.jpeg2wbmp.php" class="function">jpeg2wbmp()</a></span> wurden entfernt.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.imagecropauto.php" class="function">imagecropauto()</a></span> akzeptiert der
     Standardparameter <code class="parameter">mode</code> den Wert
     <code class="literal">-1</code> nicht mehr. Stattdessen sollte
     <strong><code><a href="image.constants.php#constant.img-crop-default">IMG_CROP_DEFAULT</a></code></strong> verwendet werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Unter Windows wurde die Datei <var class="filename">php_gd2.dll</var> in
     <var class="filename">php_gd.dll</var> umbenannt.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.gmp">
  <h3 class="title">GMP</h3>

  <p class="para">
   Die Funktion <span class="function"><a href="function.gmp-random.php" class="function">gmp_random()</a></span> wurde entfernt. Stattdessen
   sollte eine der Funktionen <span class="function"><a href="function.gmp-random-range.php" class="function">gmp_random_range()</a></span> und
   <span class="function"><a href="function.gmp-random-bits.php" class="function">gmp_random_bits()</a></span> verwendet werden.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.iconv">
  <h3 class="title">Iconv</h3>

  <p class="para">
   iconv-Implementierungen, die <var class="varname">errno</var> beim Auftreten von
   Fehlern nicht korrekt setzen, werden nicht mehr unterstützt.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.imap">
  <h3 class="title">IMAP</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.imap-headerinfo.php" class="function">imap_headerinfo()</a></span> wurde der nicht
     verwendete Parameter <code class="parameter">default_host</code> entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.imap-header.php" class="function">imap_header()</a></span>, die ein Alias von
     <span class="function"><a href="function.imap-headerinfo.php" class="function">imap_headerinfo()</a></span> ist, wurde entfernt.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.intl">
  <h3 class="title">Funktionen für die Internationalisierung</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die veraltete Konstante <strong><code><a href="intl.constants.php#constant.intl-idna-variant-2003">INTL_IDNA_VARIANT_2003</a></code></strong> wurde
     entfernt.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die veraltete Konstante <strong><code>Normalizer::NONE</code></strong> wurde
     entfernt.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.ldap">
  <h3 class="title">LDAP</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die veralteten Funktionen <span class="function"><a href="function.ldap-sort.php" class="function">ldap_sort()</a></span>,
     <span class="function"><a href="function.ldap-control-paged-result.php" class="function">ldap_control_paged_result()</a></span> und
     <span class="function"><a href="function.ldap-control-paged-result-response.php" class="function">ldap_control_paged_result_response()</a></span> wurden
     entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Schnittstelle der Funktion <span class="function"><a href="function.ldap-set-rebind-proc.php" class="function">ldap_set_rebind_proc()</a></span>
     hat sich geändert; der Parameter <code class="parameter">callback</code>
     akzeptiert keine leeren Zeichenketten nicht mehr; stattdessen sollte
     <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> verwendet werden.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.mbstring">
  <h3 class="title">MBString</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Direktive
     <a href="mbstring.configuration.php#ini.mbstring.func-overload" class="link">mbstring.func_overload</a>
     wurde entfernt. Die zugehörigen Konstanten
     <strong><code><a href="mbstring.constants.php#constant.mb-overload-mail">MB_OVERLOAD_MAIL</a></code></strong>,
     <strong><code><a href="mbstring.constants.php#constant.mb-overload-string">MB_OVERLOAD_STRING</a></code></strong> und
     <strong><code><a href="mbstring.constants.php#constant.mb-overload-regex">MB_OVERLOAD_REGEX</a></code></strong> wurden ebenfalls entfernt.
     Außerdem wurden in der Funktion <span class="function"><a href="function.mb-get-info.php" class="function">mb_get_info()</a></span> die
     Einträge <code class="literal">&quot;func_overload&quot;</code> und
     <code class="literal">&quot;func_overload_list&quot;</code> entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.mb-parse-str.php" class="function">mb_parse_str()</a></span> kann nicht mehr ohne
     Angabe eines Ergebnis-Arrays verwendet werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Eine Reihe veralteter mbregex-Aliase wurde entfernt. Siehe die folgende
     Liste, welche Funktionen stattdessen verwendet werden sollten:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="function"><strong>mbregex_encoding()</strong></span> → <span class="function"><a href="function.mb-regex-encoding.php" class="function">mb_regex_encoding()</a></span></li>
      <li><span class="function"><strong>mbereg()</strong></span> → <span class="function"><a href="function.mb-ereg.php" class="function">mb_ereg()</a></span></li>
      <li><span class="function"><strong>mberegi()</strong></span> → <span class="function"><a href="function.mb-eregi.php" class="function">mb_eregi()</a></span></li>
      <li><span class="function"><strong>mbereg_replace()</strong></span> → <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span></li>
      <li><span class="function"><strong>mberegi_replace()</strong></span> → <span class="function"><a href="function.mb-eregi-replace.php" class="function">mb_eregi_replace()</a></span></li>
      <li><span class="function"><strong>mbsplit()</strong></span> → <span class="function"><a href="function.mb-split.php" class="function">mb_split()</a></span></li>
      <li><span class="function"><strong>mbereg_match()</strong></span> → <span class="function"><a href="function.mb-ereg-match.php" class="function">mb_ereg_match()</a></span></li>
      <li><span class="function"><strong>mbereg_search()</strong></span> → <span class="function"><a href="function.mb-ereg-search.php" class="function">mb_ereg_search()</a></span></li>
      <li><span class="function"><strong>mbereg_search_pos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-pos.php" class="function">mb_ereg_search_pos()</a></span></li>
      <li><span class="function"><strong>mbereg_search_regs()</strong></span> → <span class="function"><a href="function.mb-ereg-search-regs.php" class="function">mb_ereg_search_regs()</a></span></li>
      <li><span class="function"><strong>mbereg_search_init()</strong></span> → <span class="function"><a href="function.mb-ereg-search-init.php" class="function">mb_ereg_search_init()</a></span></li>
      <li><span class="function"><strong>mbereg_search_getregs()</strong></span> → <span class="function"><a href="function.mb-ereg-search-getregs.php" class="function">mb_ereg_search_getregs()</a></span></li>
      <li><span class="function"><strong>mbereg_search_getpos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-getpos.php" class="function">mb_ereg_search_getpos()</a></span></li>
      <li><span class="function"><strong>mbereg_search_setpos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-setpos.php" class="function">mb_ereg_search_setpos()</a></span></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> wurde der
     Modifikator <code class="literal">e</code> entfernt. Stattdessen sollte die
     Funktion <span class="function"><a href="function.mb-ereg-replace-callback.php" class="function">mb_ereg_replace_callback()</a></span> verwendet werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Wenn bei der Funktion <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> der Parameter
     für das Suchmuster keine Zeichenkette ist, wird er nun als Zeichenkette
     anstelle eines ASCII-Codepunkts interpretiert. Das vorherige Verhalten
     kann durch einen expliziten Aufruf der Funktion <span class="function"><a href="function.chr.php" class="function">chr()</a></span>
     wiederhergestellt werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Der Parameter <code class="parameter">needle</code> darf bei den Funktionen
     <span class="function"><a href="function.mb-strpos.php" class="function">mb_strpos()</a></span>, <span class="function"><a href="function.mb-strrpos.php" class="function">mb_strrpos()</a></span>,
     <span class="function"><a href="function.mb-stripos.php" class="function">mb_stripos()</a></span>, <span class="function"><a href="function.mb-strripos.php" class="function">mb_strripos()</a></span>,
     <span class="function"><a href="function.mb-strstr.php" class="function">mb_strstr()</a></span>, <span class="function"><a href="function.mb-stristr.php" class="function">mb_stristr()</a></span>,
     <span class="function"><a href="function.mb-strrchr.php" class="function">mb_strrchr()</a></span> und <span class="function"><a href="function.mb-strrichr.php" class="function">mb_strrichr()</a></span> nun
     leer sein.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.mb-decode-numericentity.php" class="function">mb_decode_numericentity()</a></span> wurde der
     intern nicht verwendete Parameter <code class="parameter">is_hex</code> entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.mb-strrpos.php" class="function">mb_strrpos()</a></span> wurde das alte Verhalten
     bei Übergabe der Kodierung anstelle eines Offsets als dritter Parameter
     entfernt; stattdessen sollte der Offset <code class="literal">0</code> explizit als
     viertes Argument angegeben werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Aliase für die <code class="literal">ISO_8859-*</code>-Zeichenkodierungen
     wurden durch die <code class="literal">ISO8859-*</code>-Aliase ersetzt, um die
     Interoperabilität mit der Erweiterung iconv zu verbessern. Die
     ISO-8859-Aliase von mbregex mit Unterstrichen
     (<code class="literal">ISO_8859_*</code> und <code class="literal">ISO8859_*</code>) wurden
     ebenfalls entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.mb-ereg.php" class="function">mb_ereg()</a></span> und
     <span class="function"><a href="function.mb-eregi.php" class="function">mb_eregi()</a></span> geben bei einer gefundenen Übereinstimmung
     nun den booleschen Wert <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> zurück. Zuvor gaben sie den Integerwert
     <code class="literal">1</code> zurück, wenn der Parameter
     <code class="parameter">matches</code> nicht übergeben wurde. Wenn
     <code class="parameter">matches</code> übergeben wurde, gaben sie
     <code class="code">max(1, strlen($matches[0]))</code> zurück.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.oci8">
  <h3 class="title">OCI8</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Klassen <span class="classname"><strong class="classname">OCI-Lob</strong></span> und
     <span class="classname"><strong class="classname">OCI-Collection</strong></span> wurden umbenannt in
     <span class="classname"><a href="class.ocilob.php" class="classname">OCILob</a></span> bzw. <span class="classname"><a href="class.ocicollection.php" class="classname">OCICollection</a></span>,
     um die Namenskonformität zu gewährleisten, die in PHP 8 durch die
     arginfo-Tools für Anmerkungen zum Typ (arginfo type annotation tooling)
     erzwungen wird.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Mehrere Alias-Funktionen wurden als veraltet markiert.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.oci-internal-debug.php" class="function">oci_internal_debug()</a></span> und ihr Alias
     <span class="function"><a href="function.ociinternaldebug.php" class="function">ociinternaldebug()</a></span> wurden entfernt.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.odbc">
  <h3 class="title">ODBC</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.odbc-connect.php" class="function">odbc_connect()</a></span> verwendet Verbindungen
     nicht mehr wieder.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.odbc-exec.php" class="function">odbc_exec()</a></span> wurde der nicht
     verwendete Parameter <code class="parameter">flags</code> entfernt.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.openssl">
  <h3 class="title">OpenSSL</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Den Funktionen <span class="function"><a href="function.openssl-seal.php" class="function">openssl_seal()</a></span> und
     <span class="function"><a href="function.openssl-open.php" class="function">openssl_open()</a></span> muss nun der Parameter
     <code class="parameter">method</code> übergeben werden, da der bisherige
     Standardwert <code class="literal">&quot;RC4&quot;</code> als unsicher eingestuft wird.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.pcre">
  <h3 class="title">Reguläre Ausdrücke (Perl-kompatibel)</h3>

  <p class="para">
   Wenn ungültige Escape-Sequenzen übergeben werden, werden sie nicht mehr als
   Literale interpretiert. Dieses Verhalten erforderte bisher den Modifikator
   <code class="literal">X</code>, der nun ignoriert wird.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo">
  <h3 class="title">PHP Data Objects</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Der Standardmodus für die Fehlerbehandlung wurde von &quot;silent&quot; auf
     &quot;exceptions&quot; geändert. Siehe
     <a href="pdo.error-handling.php" class="link">Fehler und Fehlerbehandlung</a> für
     Details.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Signaturen einiger PDO-Methoden haben sich geändert:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">PDO::query(string $query, ?int $fetchMode  = null, mixed  ...$fetchModeArgs)</code></li>
      <li><code class="code">PDOStatement::setFetchMode(int $mode, mixed ...$args)</code></li>
     </ul>
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo-odbc">
  <h3 class="title">PDO-ODBC</h3>

  <p class="para">
   Die <var class="filename">php.ini</var>-Direktive
   <a href="ref.pdo-odbc.php#ini.pdo-odbc.db2-instance-name" class="link">pdo_odbc.db2_instance_name</a>
   wurde entfernt.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo-mysql">
  <h3 class="title">PDO-MySQL</h3>

  <p class="para">
   Die Methode <span class="methodname"><a href="pdo.intransaction.php" class="methodname">PDO::inTransaction()</a></span> meldet nun den
   tatsächlichen Transaktionsstatus der Verbindung, anstatt einer ungefähren
   Angabe, die von PDO verwaltet wird. Wenn eine Abfrage mit einem &quot;impliziten
   Commit&quot; ausgeführt wird, gibt <span class="methodname"><a href="pdo.intransaction.php" class="methodname">PDO::inTransaction()</a></span>
   anschließend <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück, da die Transaktion nicht mehr aktiv ist.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pgsql">
  <h3 class="title">PostgreSQL</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die veraltete <span class="function"><a href="function.pg-connect.php" class="function">pg_connect()</a></span>-Syntax mit mehreren
     Parametern anstelle einer Verbindungszeichenkette wird nicht mehr
     unterstützt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die veraltete Signatur von <span class="function"><a href="function.pg-lo-import.php" class="function">pg_lo_import()</a></span> und
     <span class="function"><a href="function.pg-lo-export.php" class="function">pg_lo_export()</a></span>, die die Verbindung als letzten
     Parameter übergibt, wird nicht mehr unterstützt. Die Verbindung sollte
     stattdessen als erster Parameter übergeben werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.pg-fetch-all.php" class="function">pg_fetch_all()</a></span> gibt für Ergebnismengen
     mit null Zeilen nun ein leeres Array statt <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück.
    </p>
   </li>
  </ul>
 </div>

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

  <p class="para">
   Um mögliche Sicherheitslücken aufgrund von Objektinstanziierung,
   Autoloading usw. zu schließen, werden Metadaten, die mit phar verknüpft
   sind, nicht mehr automatisch deserialisiert.
   
  </p>
 </div>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Signaturen der Methoden
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance($args)</code></li>
      <li><code class="code">ReflectionFunction::invoke($args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, $args)</code></li>
     </ul>
    </p>
    <p class="para">
     wurden geändert in:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance(...$args)</code></li>
      <li><code class="code">ReflectionFunction::invoke(...$args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, ...$args)</code></li>
     </ul>
    </p>
    <p class="para">
     Code, der sowohl mit PHP 7 als auch mit PHP 8 kompatibel sein muss, kann
     die folgenden Signaturen verwenden, um mit beiden Versionen kompatibel zu
     sein:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance($arg = null, ...$args)</code></li>
      <li><code class="code">ReflectionFunction::invoke($arg = null, ...$args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, $arg = null, ...$args)</code></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Methode <span class="methodname"><a href="reflectiontype.tostring.php" class="methodname">ReflectionType::__toString()</a></span> gibt nun
     eine vollständige Debug-Darstellung des Typs zurück und ist nicht mehr
     veraltet. Insbesondere enthält das Ergebnis bei nullbaren Typen den
     Hinweis, der anzeigt, dass <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> zugewiesen werden kann. Das Format des
     Rückgabewertes ist nicht stabil und kann sich zwischen den PHP-Versionen
     ändern.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die export()-Methoden von Reflection wurden entfernt. Stattdessen können
     Reflection-Objekte in Zeichenketten umgewandelt werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Methoden <span class="methodname"><a href="reflectionmethod.isconstructor.php" class="methodname">ReflectionMethod::isConstructor()</a></span> und
     <span class="methodname"><a href="reflectionmethod.isdestructor.php" class="methodname">ReflectionMethod::isDestructor()</a></span> geben nun auch
     für die Schnittstellenmethoden
     <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> und
     <a href="language.oop5.decon.php#object.destruct" class="link">__destruct()</a> <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> zurück. Zuvor
     galt dies nur für Methoden von Klassen und Traits.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Methode <span class="methodname"><strong>ReflectionType::isBuiltin()</strong></span> wurde in
     die Klasse <span class="classname"><a href="class.reflectionnamedtype.php" class="classname">ReflectionNamedType</a></span> verschoben. Die
     Klasse <span class="classname"><a href="class.reflectionuniontype.php" class="classname">ReflectionUnionType</a></span> verfügt nicht über
     diese Methode.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.sockets">
  <h3 class="title">Sockets</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.socket-addrinfo-lookup.php" class="function">socket_addrinfo_lookup()</a></span> wurden die
     veralteten <code class="parameter">flags</code>
     <strong><code>AI_IDN_ALLOW_UNASSIGNED</code></strong> und
     <strong><code>AI_IDN_USE_STD3_ASCII_RULES</code></strong> entfernt.
    </p>
   </li>
  </ul>
 </div>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Methode <span class="methodname"><a href="splfileobject.fgetss.php" class="methodname">SplFileObject::fgetss()</a></span> wurde entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Methode <span class="methodname"><a href="splfileobject.seek.php" class="methodname">SplFileObject::seek()</a></span> sucht nun immer
     am Anfang der Zeile. In früheren Versionen wurde zum Anfang der nächsten
     Zeile gesprungen, wenn als Position <code class="literal">&gt;=1</code> angegeben
     wurde.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Methode <span class="methodname"><a href="splheap.compare.php" class="methodname">SplHeap::compare()</a></span> gibt nun die
     Signatur einer Methode an. Vererbte Klassen, die diese Methode
     implementieren, müssen nun eine kompatible Methodensignatur verwenden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Methoden <span class="methodname"><a href="spldoublylinkedlist.push.php" class="methodname">SplDoublyLinkedList::push()</a></span>,
     <span class="methodname"><a href="spldoublylinkedlist.unshift.php" class="methodname">SplDoublyLinkedList::unshift()</a></span> und
     <span class="methodname"><a href="splqueue.enqueue.php" class="methodname">SplQueue::enqueue()</a></span> geben nun <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span>
     statt <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> löst nun bei
     ungültigen Parametern immer einen <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> aus,
     daher wird der zweite Parameter <code class="parameter">do_throw</code> ignoriert
     und es wird eine Meldung ausgegeben, wenn er auf <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> gesetzt ist.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Klasse <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span> implementiert nun
     <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span> anstelle von
     <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span>. Die Methoden
     <span class="methodname"><a href="splfixedarray.rewind.php" class="methodname">SplFixedArray::rewind()</a></span>,
     <span class="methodname"><a href="splfixedarray.current.php" class="methodname">SplFixedArray::current()</a></span>,
     <span class="methodname"><a href="splfixedarray.key.php" class="methodname">SplFixedArray::key()</a></span>,
     <span class="methodname"><a href="splfixedarray.next.php" class="methodname">SplFixedArray::next()</a></span> und
     <span class="methodname"><a href="splfixedarray.valid.php" class="methodname">SplFixedArray::valid()</a></span> wurden entfernt. Sie wurden
     durch <span class="methodname"><a href="splfixedarray.getiterator.php" class="methodname">SplFixedArray::getIterator()</a></span> ersetzt. Jeder
     Code, der explizit über SplFixedArray iteriert, muss nun die Methode
     <span class="methodname"><a href="splfixedarray.getiterator.php" class="methodname">SplFixedArray::getIterator()</a></span> verwenden, um einen
     <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span> zu erhalten. Dies bedeutet, dass
     <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span> nun problemlos in verschachtelten
     Schleifen verwendet werden kann.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.standard">
  <h3 class="title">Standard-Bibliothek</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.assert.php" class="function">assert()</a></span> wertet Zeichenketten-Parameter
     nicht mehr aus. Stattdessen werden sie genauso behandelt wie jeder andere
     Parameter. Statt <code class="code">assert(&#039;$a == $b&#039;)</code> sollte
     <code class="code">assert($a == $b)</code> verwendet werden. Außerdem wurden die
     INI-Direktive
     <a href="info.configuration.php#ini.assert.quiet-eval" class="link">assert.quiet_eval</a> und die
     Konstante <strong><code><a href="info.constants.php#constant.assert-quiet-eval">ASSERT_QUIET_EVAL</a></code></strong> entfernt, weil sie keine
     Wirkung mehr haben.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.parse-str.php" class="function">parse_str()</a></span> kann nicht mehr ohne Angabe
     eines Ergebnis-Arrays verwendet werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Der Filter
     <a href="filters.string.php#filters.string.strip_tags" class="link">string.strip_tags</a> wurde
     entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Der Parameter <code class="parameter">needle</code> der Funktionen
     <span class="function"><a href="function.strpos.php" class="function">strpos()</a></span>, <span class="function"><a href="function.strrpos.php" class="function">strrpos()</a></span>,
     <span class="function"><a href="function.stripos.php" class="function">stripos()</a></span>, <span class="function"><a href="function.strripos.php" class="function">strripos()</a></span>,
     <span class="function"><a href="function.strstr.php" class="function">strstr()</a></span>, <span class="function"><a href="function.strchr.php" class="function">strchr()</a></span>,
     <span class="function"><a href="function.strrchr.php" class="function">strrchr()</a></span> und <span class="function"><a href="function.stristr.php" class="function">stristr()</a></span> wird nun
     immer als Zeichenkette interpretiert. Zuvor wurde needle als
     ASCII-Codepunkt interpretiert, wenn es keine Zeichenkette war. Das
     vorherige Verhalten kann durch einen expliziten Aufruf von
     <span class="function"><a href="function.chr.php" class="function">chr()</a></span> wiederhergestellt werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei den Funktionen <span class="function"><a href="function.strpos.php" class="function">strpos()</a></span>,
     <span class="function"><a href="function.strrpos.php" class="function">strrpos()</a></span>, <span class="function"><a href="function.stripos.php" class="function">stripos()</a></span>,
     <span class="function"><a href="function.strripos.php" class="function">strripos()</a></span>, <span class="function"><a href="function.strstr.php" class="function">strstr()</a></span>,
     <span class="function"><a href="function.stristr.php" class="function">stristr()</a></span> und <span class="function"><a href="function.strrchr.php" class="function">strrchr()</a></span> darf der
     Parameter <code class="parameter">needle</code> nun leer sein.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei den Funktionen <span class="function"><a href="function.substr.php" class="function">substr()</a></span>,
     <span class="function"><a href="function.substr-count.php" class="function">substr_count()</a></span>, <span class="function"><a href="function.substr-compare.php" class="function">substr_compare()</a></span>
     und <span class="function"><a href="function.iconv-substr.php" class="function">iconv_substr()</a></span> darf der Parameter
     <code class="parameter">length</code> nun <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> sein. Wenn <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> angegeben
     wird, verhalten sich die Funktionen so, als ob der Parameter für die
     Länge nicht angegeben worden wäre. Daher wird in diesem Fall anstelle
     einer leeren Zeichenkette der Rest der Zeichenkette zurückgegeben.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.array-splice.php" class="function">array_splice()</a></span> darf der Parameter
     <code class="parameter">length</code> nun <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> sein. Wenn <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> angegeben
     wird, verhält sich die Funktion so, als ob der Parameter nicht angegeben
     worden wäre. Daher löscht die Funktion in diesem Fall alles von
     <code class="parameter">offset</code> bis zum Ende des Arrays.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei den Funktionen <span class="function"><a href="function.vsprintf.php" class="function">vsprintf()</a></span>,
     <span class="function"><a href="function.vfprintf.php" class="function">vfprintf()</a></span> und <span class="function"><a href="function.vprintf.php" class="function">vprintf()</a></span> muss der
     Parameter <code class="parameter">args</code> nun ein Array sein. Zuvor wurde
     jeder Typ akzeptiert.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> wird die Option
     <code class="literal">&#039;salt&#039;</code> nicht mehr unterstützt. Wenn die Option
     <code class="literal">&#039;salt&#039;</code> verwendet wird, wird eine Warnung erzeugt und
     das angegebene Salz wird ignoriert und stattdessen ein generiertes Salz
     verwendet.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.quotemeta.php" class="function">quotemeta()</a></span> gibt nun eine leere
     Zeichenkette zurück, wenn eine leere Zeichenkette übergeben wurde. Zuvor
     wurde <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurückgegeben.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die folgenden Funktionen wurden entfernt:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="function"><a href="function.hebrevc.php" class="function">hebrevc()</a></span></li>
      <li><span class="function"><a href="function.convert-cyr-string.php" class="function">convert_cyr_string()</a></span></li>
      <li><span class="function"><a href="function.money-format.php" class="function">money_format()</a></span></li>
      <li><span class="function"><a href="function.ezmlm-hash.php" class="function">ezmlm_hash()</a></span></li>
      <li><span class="function"><a href="function.restore-include-path.php" class="function">restore_include_path()</a></span></li>
      <li><span class="function"><a href="function.get-magic-quotes-gpc.php" class="function">get_magic_quotes_gpc()</a></span></li>
      <li><span class="function"><a href="function.get-magic-quotes-runtime.php" class="function">get_magic_quotes_runtime()</a></span></li>
      <li><span class="function"><a href="function.fgetss.php" class="function">fgetss()</a></span></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Konstante <strong><code><a href="filter.constants.php#constant.filter-sanitize-magic-quotes">FILTER_SANITIZE_MAGIC_QUOTES</a></code></strong> wurde
     entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Der Aufruf der Funktion <span class="function"><a href="function.implode.php" class="function">implode()</a></span> mit Parametern in
     umgekehrter Reihenfolge <code class="code">($pieces, $glue)</code> wird nicht mehr
     unterstützt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.parse-url.php" class="function">parse_url()</a></span> unterscheidet nun zwischen
     fehlenden und leeren Anfragen und Fragmenten:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">http://example.com/foo → query = null, fragment = null</code></li>
      <li><code class="code">http://example.com/foo? → query = &quot;&quot;,   fragment = null</code></li>
      <li><code class="code">http://example.com/foo# → query = null, fragment = &quot;&quot;</code></li>
      <li><code class="code">http://example.com/foo?# → query = &quot;&quot;,   fragment = &quot;&quot;</code></li>
     </ul>
      Zuvor waren query und fragment in allen oben genannten Fällen <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> und
     <span class="function"><a href="function.debug-zval-dump.php" class="function">debug_zval_dump()</a></span> geben Gleitkommazahlen nun aus,
     indem sie
     <a href="ini.core.php#ini.serialize-precision" class="link">serialize_precision</a> statt
     <a href="ini.core.php#ini.precision" class="link">precision</a> verwenden. Bei einer
     Standardkonfiguration bedeutet dies, dass Gleitkommazahlen von diesen
     Debugging-Funktionen nun mit voller Genauigkeit ausgegeben werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Wenn das von <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> zurückgegebene
     Array nicht existierende Eigenschaften enthält, werden diese nun
     stillschweigend ignoriert. Zuvor wurden solche Eigenschaften so
     serialisiert, als hätten sie den Wert <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Beim Start ist die Standard-Locale nun immer <code class="literal">&quot;C&quot;</code>.
     Standardmäßig werden keine Locales von der Umgebung übernommen. Zuvor war
     <strong><code><a href="string.constants.php#constant.lc-all">LC_ALL</a></code></strong> auf <code class="literal">&quot;C&quot;</code> gesetzt, während
     <strong><code><a href="string.constants.php#constant.lc-ctype">LC_CTYPE</a></code></strong> von der Umgebung übernommen wurde.
     Allerdings haben einige Funktionen die übernommene Locale ohne expliziten
     Aufruf von <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span> nicht berücksichtigt. Ein
     expliziter Aufruf von <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span> ist nun immer
     erforderlich, wenn eine Komponente der Locale von ihrem Standardwert
     abweichen soll.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     In der Funktion <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> wurde der veraltete
     DES-Fallback entfernt. Wenn ein unbekanntes Salt-Format an
     <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> übergeben wird, schlägt die Funktion nun mit
     <code class="literal">*0</code> fehl, anstatt auf einen schwachen DES-Hash
     zurückzugreifen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> schlägt bei der Angabe von
     Runden, die außerhalb des Bereichs für SHA256/SHA512 liegen, nun mit
     <code class="literal">*0</code> fehl, anstatt auf die nächstgelegene Grenze zu
     setzen. Dies entspricht dem Verhalten der glibc.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Das Ergebnis von Sortierfunktionen kann sich ändern, wenn das Array
     Elemente enthält, die als gleich bewertet werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Alle für Callbacks geeigneten Funktionen, bei denen nicht explizit
     angegeben ist, dass sie per Referenz übergebene Parameter akzeptieren,
     geben nun eine Warnung aus, wenn eine Callback-Funktion mit
     Referenz-Parametern verwendet wird. Beispiele sind
     <span class="function"><a href="function.array-filter.php" class="function">array_filter()</a></span> und <span class="function"><a href="function.array-reduce.php" class="function">array_reduce()</a></span>.
     Dies war bereits bei den meisten Funktionen der Fall, aber nicht bei
     allen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Der HTTP-Stream-Wrapper, der von Funktionen wie
     <span class="function"><a href="function.file-get-contents.php" class="function">file_get_contents()</a></span> verwendet wird, meldet nun
     HTTP/1.1 statt HTTP/1.0. Dies ändert nichts am Verhalten des Clients,
     kann aber dazu führen, dass Server anders reagieren. Um das alte
     Verhalten beizubehalten, muss die Stream-Kontext-Option
     <code class="literal">&#039;protocol_version&#039;</code> gesetzt werden, z. B.
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$ctx </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_context_create</span><span style="color: #007700">([</span><span style="color: #DD0000">'http' </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'protocol_version' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'1.0'</span><span style="color: #007700">]]);<br />echo </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'http://example.org'</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Der Aufruf der Funktion <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> ohne explizites Salz
     wird nicht mehr unterstützt. Wenn ein starker Hash mit automatisch
     generiertem Salz erzeugt werden soll, kann stattdessen
     <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> verwendet werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.substr.php" class="function">substr()</a></span>,
     <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span>, <span class="function"><a href="function.iconv-substr.php" class="function">iconv_substr()</a></span> und
     <span class="function"><a href="function.grapheme-substr.php" class="function">grapheme_substr()</a></span> setzen Offsets, die außerhalb einer
     Zeichenkette liegen, nun einheitlich auf die Grenzen der Zeichenkette.
     Zuvor wurde in einigen Fällen <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> anstelle einer leeren Zeichenkette
     zurückgegeben
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Unter Windows führen die Funktionen für die Ausführung von Programmen,
     die die Shell verwenden (<span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span>,
     <span class="function"><a href="function.exec.php" class="function">exec()</a></span>, <span class="function"><a href="function.popen.php" class="function">popen()</a></span> usw.) nun
     konsequent den Befehl <strong class="command">%comspec% /s /c &quot;$commandline&quot;</strong>
     aus, was den gleichen Effekt hat wie die Ausführung von
     <strong class="command">$commandline</strong> (ohne zusätzliche Anführungszeichen).
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.sysvsem">
  <h3 class="title">Sysvsem</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="function.sem-get.php" class="function">sem_get()</a></span> wurde der Parameter
     <code class="parameter">auto_release</code> geändert und akzeptiert nun boolsche
     Werte (bool) anstelle von ganzen Zahlen (int).
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.tidy">
  <h3 class="title">Tidy</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Bei der Funktion <span class="function"><a href="tidy.repairstring.php" class="function">tidy_repair_string()</a></span> wurde der intern
     nicht verwendete Parameter <code class="parameter">use_include_path</code>
     entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="tidy.repairstring.php" class="methodname">tidy::repairString()</a></span> und
     <span class="methodname"><a href="tidy.repairfile.php" class="methodname">tidy::repairFile()</a></span> sind nun statische Methoden.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.tokenizer">
  <h3 class="title">Tokenizer</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Das Token <strong><code><a href="tokens.php#constant.t-comment">T_COMMENT</a></code></strong> enthält keinen abschließenden
     Zeilenumbruch mehr. Der Zeilenumbruch gehört nun zum nachfolgenden
     <strong><code><a href="tokens.php#constant.t-whitespace">T_WHITESPACE</a></code></strong>-Token. Es ist wichtig zu beachten, dass
     auf <strong><code><a href="tokens.php#constant.t-comment">T_COMMENT</a></code></strong> nicht immer ein Leerzeichen folgt. Es
     könnte auch ein <strong><code><a href="tokens.php#constant.t-close-tag">T_CLOSE_TAG</a></code></strong> oder das Ende der Datei
     folgen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Namen innerhalb eines Namensraums werden nun durch die Token
     <strong><code><a href="tokens.php#constant.t-name-qualified">T_NAME_QUALIFIED</a></code></strong> (<code class="code">Foo\Bar</code>),
     <strong><code><a href="tokens.php#constant.t-name-fully-qualified">T_NAME_FULLY_QUALIFIED</a></code></strong> (<code class="code">\Foo\Bar</code>) und
     <strong><code><a href="tokens.php#constant.t-name-relative">T_NAME_RELATIVE</a></code></strong> (<code class="code">namespace\Foo\Bar</code>)
     dargestellt. Das Token <strong><code><a href="tokens.php#constant.t-ns-separator">T_NS_SEPARATOR</a></code></strong> wird nur als
     einfaches Begrenzungszeichen für den Namensraum verwendet. Es ist
     syntaktisch nur zulässig, wenn es in Verbindung mit einer gruppierten
     use-Deklaration verwendet wird.
     
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.xmlreader">
  <h3 class="title">XMLReader</h3>

  <p class="para">
   <span class="methodname"><a href="xmlreader.open.php" class="methodname">XMLReader::open()</a></span> und
   <span class="methodname"><a href="xmlreader.xml.php" class="methodname">XMLReader::XML()</a></span> sind nun statische Methoden. Sie
   können immer noch als Instanzmethoden aufgerufen werden, aber erbende
   Klassen müssen diese Methoden als statisch deklarieren, wenn sie sie
   überschreiben.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.xmlrpc">
  <h3 class="title">XML-RPC</h3>

  <p class="para">
   Die Erweiterung XML-RPC wurde nach PECL verschoben und ist nicht mehr Teil
   der PHP-Distribution.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.zip">
  <h3 class="title">Zip</h3>

  <p class="para">
   Die Konstante <strong><code>ZipArchive::OPSYS_Z_CPM</code></strong> wurde entfernt
   (dieser Name hat einen Tippfehler); stattdessen sollte
   <strong><code><a href="zip.constants.php#ziparchive.constants.opsys-cpm">ZipArchive::OPSYS_CPM</a></code></strong> verwendet werden.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.zlib">
  <h3 class="title">Zlib</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.gzgetss.php" class="function">gzgetss()</a></span> wurde entfernt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <a href="zlib.configuration.php#ini.zlib.output-compression" class="link">zlib.output_compression</a>
     ist für <code class="literal">Content-Type: image/*</code> nicht mehr automatisch
     deaktiviert.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.php-test-packs">
  <h3 class="title">PHP-Test-Suites für Windows</h3>

  <p class="para">
   Das Skript zur Durchführung von Tests wurde von
   <var class="filename">run-test.php</var> in <var class="filename">run-tests.php</var>
   umbenannt, damit es dem Namen in php-src entspricht.
  </p>
 </div>
</div><?php manual_footer($setup); ?>