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

contributors($setup);

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

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

  <div class="sect3" id="migration74.incompatible.core.non-array-access">
   <h4 class="title">Zugriff auf Nicht-Arrays im Array-Stil</h4>

   <p class="para">
    Der Versuch, Werte vom Typ <span class="type"><a href="language.types.null.php" class="type null">null</a></span>, <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>,
    <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, <span class="type"><a href="language.types.float.php" class="type float">float</a></span> oder <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> wie ein
    Array zu verwenden, (z. B. <code class="literal">$null[&quot;key&quot;]</code>) erzeugt nun
    einen Hinweis.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.get-declared-classes">
   <h4 class="title">Die Funktion <span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span></h4>

   <p class="para">
    <span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span> gibt keine anonymen Klassen mehr
    zurück, die noch nicht instanziiert wurden.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fn">
   <h4 class="title">Das Schlüsselwort <code class="literal">fn</code></h4>

   <p class="para">
    <code class="literal">fn</code> ist nun ein reserviertes Schlüsselwort. Insbesondere
    kann es nicht mehr als Funktions- oder Klassenname verwendet werden.
    Es kann weiterhin als Name einer Methode oder Klassenkonstante verwendet
    werden.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.php-tag">
   <h4 class="title"><code class="literal">&lt;?php</code>-Tag am Ende der Datei</h4>

   <p class="para">
    Das Tag <code class="literal">&lt;?php</code> am Ende der Datei (ohne nachgestellten
    Zeilenumbruch) wird nun als ein öffnendes PHP-Tag interpretiert. Zuvor
    wurde es entweder als kurzes öffnendes Tag gefolgt vom Literal
    <code class="literal">php</code> interpretiert und führte zu einem Syntaxfehler (bei
    <code class="literal">short_open_tag=1</code>) oder es wurde als literale
    Zeichenkette <code class="literal">&lt;?php</code> interpretiert (bei
    <code class="literal">short_open_tag=0</code>).
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.stream-wrappers">
   <h4 class="title">Stream-Wrapper</h4>

   <p class="para">
    Wenn include/require für einen Stream verwendet wird, wird
    <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span> mit der Option
    <strong><code><a href="stream.constants.php#constant.stream-option-read-buffer">STREAM_OPTION_READ_BUFFER</a></code></strong> aufgerufen. Bei einem
    benutzerdefinierten Stream-Wrapper kann es notwendig sein, die Methode
    <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span> zu
    implementieren, um eine Warnung zu vermeiden (eine Implementierung, die
    immer <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurückgibt, ist normalerweise ausreichend).
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.serialization">
   <h4 class="title">Serialisierung</h4>

   <p class="para">
    Das Serialisierungsformat <code class="literal">o</code> wurde entfernt. Da es von
    PHP nie erzeugt wurde, kann dies nur die Deserialisierung von manuell
    erstellten Zeichenketten beeinträchtigen.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.password-algorithm-constants">
   <h4 class="title">Konstanten für den Passwort-Algorithmus</h4>

   <p class="para">
    Die Bezeichner der Algorithmen für das Hashing von Passwörtern sind nun
    keine Ganzzahlen mehr, sondern nullbare Zeichenketten.
   </p>

   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-default">PASSWORD_DEFAULT</a></code></strong> war int 1 und ist nun &#039;2y&#039; (in
      PHP 7.4.0, 7.4.1 und 7.4.2 war es <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>)
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong> war int 1 und ist nun &#039;2y&#039;
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong> war int 2 und ist nun &#039;argon2i&#039;
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong> war int 3 und ist nun &#039;argon2id&#039;
     </span>
    </li>
   </ul>

   <p class="para">
    Anwendungen, die die Konstanten PASSWORD_DEFAULT, PASSWORD_BCRYPT,
    PASSWORD_ARGON2I und PASSWORD_ARGON2ID korrekt verwenden, werden weiterhin
    korrekt funktionieren.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.htmlentities">
   <h4 class="title">Die Funktion <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span></h4>

   <p class="para">
    <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span> erzeugt nun einen Hinweis (anstelle
    einer Warnung wegen strikter Standards), wenn sie mit einer Kodierung
    verwendet wird, bei der nur die Substitution von Basisentitäten
    unterstützt wird. In diesem Fall entspricht das der Funktion
    <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fread-fwrite">
   <h4 class="title">Die Funktionen <span class="function"><a href="function.fread.php" class="function">fread()</a></span> und <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span></h4>

   <p class="para">
    <span class="function"><a href="function.fread.php" class="function">fread()</a></span> und <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span> geben nun
    <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück, wenn die Operation fehlgeschlagen ist; zuvor wurde eine
    leere Zeichenkette oder 0 zurückgegeben. EAGAIN/EWOULDBLOCK werden nicht
    als Fehler gewertet.
   </p>
   <p class="para">
    Diese Funktionen geben nun auch bei Fehlern eine Meldung aus, z. B. wenn
    versucht wird, in eine schreibgeschützte Dateiressource zu schreiben.
   </p>
  </div>

 </div>

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

  <p class="para">
   BCMath-Funktionen erzeugen nun eine Warnung, wenn eine nicht wohlgeformte
   Zahl übergeben wird, z. B. <code class="literal">&quot;32foo&quot;</code>. Der Parameter wird
   wie bisher als Null interpretiert.
  </p>
 </div>

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

  <p class="para">
   Der Versuch, eine <span class="classname"><a href="class.curlfile.php" class="classname">CURLFile</a></span>-Klasse zu serialisieren,
   erzeugt nun eine Exception. Zuvor wurde die Exception nur bei der
   Deserialisierung ausgelöst.
  </p>
  <p class="para">
   Die Verwendung von <strong><code><a href="curl.constants.php#constant.curlpipe-http1">CURLPIPE_HTTP1</a></code></strong> ist veraltet und
   wird ab cURL 7.62.0 nicht mehr unterstützt.
  </p>
  <p class="para">
   Bei der Funktion <span class="function"><a href="function.curl-version.php" class="function">curl_version()</a></span> ist der Parameter
   <code class="literal">$version</code> veraltet. Wenn ein anderer Wert als der
   Standardwert <strong><code><a href="curl.constants.php#constant.curlversion-now">CURLVERSION_NOW</a></code></strong> übergeben wird, wird eine
   Warnung ausgegeben und der Parameter wird ignoriert.
  </p>
 </div>

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

  <p class="para">
   Der Aufruf von <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> oder ähnlichem mit einer
   Instanz von <span class="classname"><a href="class.datetime.php" class="classname">DateTime</a></span> oder
   <span class="classname"><a href="class.datetimeimmutable.php" class="classname">DateTimeImmutable</a></span> hinterlässt keine verfügbaren
   Eigenschaften des Objekts mehr.
  </p>
  <p class="para">
   Der Vergleich von <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span>-Objekten (mittels
   <code class="literal">==</code>, <code class="literal">&lt;</code> usw.) erzeugt nun eine
   Warnung und gibt immer <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück. Zuvor wurden alle
   <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span>-Objekte als gleich angesehen, sofern
   sie keine Eigenschaften hatten.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.intl">
  <h3 class="title">Intl</h3>

  <p class="para">
   Bei den Funktionen <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> und
   <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span> ist der Standardwert des Parameters nun
   <strong><code><a href="intl.constants.php#constant.intl-idna-variant-uts46">INTL_IDNA_VARIANT_UTS46</a></code></strong> anstelle des veralteten
   <strong><code><a href="intl.constants.php#constant.intl-idna-variant-2003">INTL_IDNA_VARIANT_2003</a></code></strong>.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.mysqli">
  <h3 class="title">MySQLi</h3>

  <p class="para">
   Die integrierte Serverfunktionalität wurde entfernt. Sie war seit
   mindestens PHP 7.0 fehlerhaft.
  </p>
  <p class="para">
   Die undokumentierte Eigenschaft <code class="literal">mysqli::$stat</code> wurde
   zugunsten von <span class="methodname"><a href="mysqli.stat.php" class="methodname">mysqli::stat()</a></span> entfernt.
  </p>
 </div>

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

  <p class="para">
   Die Funktion <span class="function"><a href="function.openssl-random-pseudo-bytes.php" class="function">openssl_random_pseudo_bytes()</a></span> löst nun
   ähnlich wie <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span> bei Fehlern eine Exception
   aus. Insbesondere wird ein <span class="classname"><a href="class.error.php" class="classname">Error</a></span> ausgelöst, wenn die
   Anzahl der angeforderten Bytes kleiner oder gleich Null ist, und eine
   <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> wird ausgelöst, wenn nicht genügend
   Zufallsdaten gesammelt werden können. Wenn die Funktion keine Exception
   wirft, ist der Ausgabeparameter <code class="literal">$crypto_strong</code>
   garantiert immer <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, weshalb eine explizite Überprüfung nicht nötig ist.
  </p>
 </div>

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

  <p class="para">
   Wenn der Modus <strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong> verwendet wird,
   werden nicht gefundene Teilsuchmuster nun auch auf <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> gesetzt (oder
   <code class="literal">[null, -1]</code>, wenn die Erfassung des Offsets aktiviert
   ist). Das bedeutet, dass die Größe der <code class="literal">$matches</code>
   (Übereinstimmungen) immer gleich ist.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.pdo">
  <h3 class="title">PHP-Datenobjekte (PDO)</h3>

  <p class="para">
   Der Versuch, eine Instanz von <span class="classname"><a href="class.pdo.php" class="classname">PDO</a></span> oder
   <span class="classname"><a href="class.pdostatement.php" class="classname">PDOStatement</a></span> zu serialisieren, erzeugt nun eine
   <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> anstelle einer
   <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span>, was dem Verhalten anderer interner
   Klassen entspricht, die keine Serialisierung unterstützen.
  </p>
 </div>

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

  <p class="para">
   Reflection-Objekte erzeugen nun eine Exception, wenn versucht wird, sie zu
   serialisieren. Die Serialisierung von Reflection-Objekten wurde nie
   unterstützt und führte zu beschädigten Reflection-Objekten. Sie ist nun
   ausdrücklich verboten.
  </p>

  <p class="para">
   Die Werte der Klassenkonstanten von
   <span class="classname"><a href="class.reflectionclassconstant.php" class="classname">ReflectionClassConstant</a></span>,
   <span class="classname"><a href="class.reflectionmethod.php" class="classname">ReflectionMethod</a></span> und
   <span class="classname"><a href="class.reflectionproperty.php" class="classname">ReflectionProperty</a></span> haben sich geändert.
  </p>
 </div>

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

  <p class="para">
   Wenn die Funktion <span class="function"><a href="function.get-object-vars.php" class="function">get_object_vars()</a></span> für eine Instanz von
   <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span> aufgerufen wird, gibt sie nun immer die
   Eigenschaften der Klasse <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span> selbst (oder
   einer Unterklasse) zurück. Zuvor wurden die Werte des betreffenden
   Arrays/Objekts zurückgegeben, es sei denn, das Flag
   <strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong> wurde angegeben.
  </p>
  <p class="para">
   Andere betroffene Operationen sind:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Die Methode <span class="methodname"><strong>ReflectionObject::getProperties()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Die Funktionen <span class="function"><a href="function.reset.php" class="function">reset()</a></span>, <span class="function"><a href="function.current.php" class="function">current()</a></span>
     usw. Stattdessen sollten die Methoden von
     <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span> verwendet werden.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Möglicherweise andere, die Objekteigenschaften als Liste bearbeiten, z. B.
     die Funktion <span class="function"><a href="function.array-walk.php" class="function">array_walk()</a></span>.
    </span>
   </li>
  </ul>
  <p class="para">
   Typumwandlungen mit <code class="literal">(array)</code> sind davon nicht betroffen.
   Sie geben weiterhin entweder das betreffende Array oder die Eigenschaften
   der Klasse <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span> zurück, je nachdem ob das
   Flag <strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong> verwendet wird.
  </p>
  <p class="para">
   Die Methode <span class="methodname"><a href="splpriorityqueue.setextractflags.php" class="methodname">SplPriorityQueue::setExtractFlags()</a></span> löst
   eine Exception aus, wenn Null (<code class="literal">0</code>) übergeben wird. Zuvor
   erzeugte dies bei der nächsten Extraktionsoperation einen behebbaren
   schwerwiegenden Fehler.
  </p>
  <p class="para">
   Die Klassen <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>,
   <span class="classname"><a href="class.arrayiterator.php" class="classname">ArrayIterator</a></span>,
   <span class="classname"><a href="class.spldoublylinkedlist.php" class="classname">SplDoublyLinkedList</a></span> und
   <span class="classname"><a href="class.splobjectstorage.php" class="classname">SplObjectStorage</a></span> unterstützen nun zusätzlich zur
   Schnittstelle <span class="interfacename"><a href="class.serializable.php" class="interfacename">Serializable</a></span> das Verfahren
   <code class="literal">__serialize()</code> und <code class="literal">__unserialize()</code>.
   Das bedeutet, dass die mit älteren PHP-Versionen serialisierten Daten immer
   noch deserialisiert werden können, aber Daten, die mit PHP 7.4 erstellt
   wurden, von älteren Versionen nicht verstanden werden.
  </p>
 </div>

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

  <p class="para">
   Die Funktion <span class="function"><a href="function.token-get-all.php" class="function">token_get_all()</a></span> gibt für unerwartete
   Zeichen nun ein <strong><code><a href="tokens.php#constant.t-bad-character">T_BAD_CHARACTER</a></code></strong>-Token aus, anstatt
   Löcher im Token-Stream zu hinterlassen.
  </p>
 </div>

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

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

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