<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration83.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'migration83.other-changes.php',
    1 => 'Sonstige &Auml;nderungen',
    2 => 'Sonstige &Auml;nderungen',
  ),
  'up' => 
  array (
    0 => 'migration83.php',
    1 => 'Migration von PHP 8.2.x auf PHP 8.3.x',
  ),
  'prev' => 
  array (
    0 => 'migration83.deprecated.php',
    1 => 'Veraltete Features',
  ),
  'next' => 
  array (
    0 => 'migration83.windows-support.php',
    1 => 'Windows-Unterst&uuml;tzung',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'appendices/migration83/other-changes.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration83.other-changes" class="sect1">
 <h2 class="title">Sonstige Änderungen</h2>

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

  <div class="sect3" id="migration83.other-changes.core.ffi">
   <h4 class="title">FFI</h4>

   <p class="para">
    Die Methode <span class="methodname"><a href="ffi.load.php" class="methodname">FFI::load()</a></span> kann nun während des
    Preloads aufgerufen werden, wenn
    <a href="opcache.configuration.php#ini.opcache.preload-user" class="link">opcache.preload_user</a> der
    aktuelle Systembenutzer ist. Zuvor war der Aufruf von
    <span class="methodname"><a href="ffi.load.php" class="methodname">FFI::load()</a></span> während des Preloads nicht möglich,
    wenn die Direktive
    <a href="opcache.configuration.php#ini.opcache.preload-user" class="link">opcache.preload_user</a>
    gesetzt war.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.core.fpm">
   <h4 class="title">FPM</h4>

   <p class="para">
    Der FPM CLI-Test schlägt nun fehl, wenn der Socket-Pfad länger ist als vom
    Betriebssystem unterstützt.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.core.opcache">
   <h4 class="title">Opcache</h4>

   <p class="para">
    In den SAPIs CLI und phpdbg muss die Direktive
    <a href="opcache.configuration.php#ini.opcache.preload-user" class="link">opcache.preload_user</a> nicht
    mehr für das Preloading gesetzt werden, wenn sie als root ausgeführt
    werden. In anderen SAPIs ist diese Direktive weiterhin erforderlich, wenn
    sie als root ausgeführt werden, weil das Preloading durchgeführt wird,
    bevor die SAPI zu einem unprivilegierten Benutzer wechselt.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.core.streams">
   <h4 class="title">Streams</h4>

   <p class="para">
    Wenn die Funktion <span class="function"><a href="function.fread.php" class="function">fread()</a></span> auf einer Socket-Verbindung
    blockiert wird und gepufferte Daten vorhanden sind, gibt sie diese sofort
    zurück, statt auf weitere Daten zu warten.
   </p>

   <p class="para">
    Ein Speicherstrom schlägt nicht mehr fehl, wenn der Such-Offset über das
    Ende hinausgeht. Stattdessen wird der Speicher beim nächsten Schreibvorgang
    vergrößert und der Bereich zwischen dem alten Ende und dem Offset wird mit
    Nullbytes gefüllt, ähnlich wie es auch bei Dateien der Fall ist.
   </p>

   <p class="para">
    <span class="function"><a href="function.stat.php" class="function">stat()</a></span>-Zugriffsoperationen wie
    <span class="function"><a href="function.file-exists.php" class="function">file_exists()</a></span> und ähnliche verwenden nun den
    tatsächlichen Pfad statt des aktuellen Stream-Pfads, was mit dem Öffnen
    von Streams übereinstimmt.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration83.other-changes.sapi">
  <h3 class="title">Änderungen in SAPI-Modulen</h3>

  <div class="sect3" id="migration83.other-changes.sapi.cli">
   <h4 class="title">CLI</h4>

   <p class="para">
    Die <strong><code><a href="reserved.constants.php#constant.stdout">STDOUT</a></code></strong>-, <strong><code><a href="reserved.constants.php#constant.stderr">STDERR</a></code></strong>- und
    <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong>-Streams werden nicht mehr geschlossen, wenn die
    Ressource zerstört wird, was in der Regel beim Beenden der CLI der Fall
    ist. Es ist jedoch immer noch möglich, diese Streams mittels
    <span class="function"><a href="function.fclose.php" class="function">fclose()</a></span> und ähnlichem explizit zu schließen.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration83.other-changes.functions">
  <h3 class="title">Geänderte Funktionen</h3>

  <div class="sect3" id="migration83.other-changes.functions.core">
   <h4 class="title">PHP-Kern</h4>

   <p class="para">
    Bei der Funktion <span class="function"><a href="function.gc-status.php" class="function">gc_status()</a></span> wurden die folgenden 8
    Felder hinzugefügt:

    <ul class="simplelist">
     <li><code class="literal">&quot;running&quot;</code> => bool</li>
     <li><code class="literal">&quot;protected&quot;</code> => bool</li>
     <li><code class="literal">&quot;full&quot;</code> => bool</li>
     <li><code class="literal">&quot;buffer_size&quot;</code> => int</li>
     <li>
      <code class="literal">&quot;application_time&quot;</code> => float: die gesamte
      Ausführungszeit der Anwendung in Sekunden (einschließlich collector_time)
     </li>
     <li>
      <code class="literal">&quot;collector_time&quot;</code> =>float: die Zeit, die mit dem
      Sammeln von Zyklen verbracht wurde, in Sekunden (einschließlich
      destructor_time und free_time)
     </li>
     <li>
      <code class="literal">&quot;destructor_time&quot;</code> => float: die Zeit, die während des
      Sammelns von Zyklen für die Ausführung von Destruktoren benötigt wurde,
      in Sekunden
     </li>
     <li>
      <code class="literal">&quot;free_time&quot;</code> => float: die Zeit, die während des
      Sammelns von Zyklen dafür benötigt wurde, Speicher freizugeben, in
      Sekunden
     </li>
    </ul>
   </p>

   <p class="para">
    Mit der Funktion <span class="function"><a href="function.class-alias.php" class="function">class_alias()</a></span> kann nun ein Alias einer
    internen Klasse erstellt werden.
   </p>

   <p class="para">
    Wenn <a href="ini.core.php#ini.open-basedir" class="link">open_basedir</a> zur Laufzeit
    mittels <code class="code">ini_set(&#039;open_basedir&#039;, ...);</code> gesetzt wird, werden
    keine Pfade mehr akzeptiert, die das übergeordnete Verzeichnis
    (<code class="literal">..</code>) enthalten; zuvor waren nur die Pfade unzulässig,
    die mit <code class="literal">..</code> beginnen. Dies konnte leicht umgangen
    werden, indem dem Pfad <code class="literal">./</code> vorangestellt wurde.
   </p>

   <p class="para">
    Benutzerdefinierte Exception-Handler fangen nun Exceptions beim
    Herunterfahren ab.
   </p>

   <p class="para">
    Die HTML-Ausgabe der Funktionen <span class="function"><a href="function.highlight-string.php" class="function">highlight_string()</a></span> und
    <span class="function"><a href="function.highlight-file.php" class="function">highlight_file()</a></span> wurde geändert. Leerzeichen zwischen
    äußeren HTML-Tags werden entfernt. Zeilenumbrüche und Leerzeichen werden
    nicht mehr in HTML-Entities umgewandelt. Der gesamte HTML-Text wird nun in
    <code class="literal">&lt;pre&gt;</code>-Tags eingeschlossen. Die äußeren
    <code class="literal">&lt;span&gt;</code>-Tags wurden mit den
    <code class="literal">&lt;code&gt;</code>-Tags verschmolzen.
   </p>

  </div>

  <div class="sect3" id="migration83.other-changes.functions.calendar">
   <h4 class="title">Calendar</h4>

   <p class="para">
    Die Funktion <span class="function"><a href="function.easter-date.php" class="function">easter_date()</a></span> unterstützt nun auf
    64-Bit-Systemen die Jahreszahlen von 1970 bis 2.000.000.000; bisher wurden
    nur die Jahre im Bereich von 1970 bis 2037 unterstützt.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.curl">
   <h4 class="title">Curl</h4>

   <p class="para">
    Die Funktion <span class="function"><a href="function.curl-getinfo.php" class="function">curl_getinfo()</a></span> unterstützt nun zwei neue
    Konstanten: <strong><code><a href="curl.constants.php#constant.curlinfo-capath">CURLINFO_CAPATH</a></code></strong> und
    <strong><code><a href="curl.constants.php#constant.curlinfo-cainfo">CURLINFO_CAINFO</a></code></strong>. Wenn der Wert des Parameters option
    <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> ist, stehen die zwei zusätzlichen Schlüssel
    <code class="literal">&quot;capath&quot;</code> und <code class="literal">&quot;cainfo&quot;</code> zur Verfügung.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.dom">
   <h4 class="title">DOM</h4>

   <p class="para">
    Der voreingestellte Rückgabetyp der Methode
    <span class="methodname"><a href="domcharacterdata.appenddata.php" class="methodname">DOMCharacterData::appendData()</a></span> wurde auf
    <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> geändert.
   </p>

   <p class="para">
    Der voreingestellte Rückgabetyp der Methoden
    <span class="methodname"><a href="domdocument.loadhtml.php" class="methodname">DOMDocument::loadHTML()</a></span>,
    <span class="methodname"><a href="domdocument.loadhtmlfile.php" class="methodname">DOMDocument::loadHTMLFile()</a></span> und
    <span class="methodname"><a href="domdocument.loadxml.php" class="methodname">DOMDocument::loadXML()</a></span> ist nun <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
    Zuvor war dies mit dem Rückgabetyp <code class="code">DOMDocument|bool</code>
    dokumentiert, aber seit PHP 8.0.0 kann ein Objekt der Klasse
    <span class="classname"><a href="class.domdocument.php" class="classname">DOMDocument</a></span> nicht mehr zurückgegeben werden, da es
    nicht mehr statisch aufgerufen werden kann.
   </p>

  </div>

  <div class="sect3" id="migration83.other-changes.functions.gd">
   <h4 class="title">Gd</h4>

   <p class="para">
    Die Signatur der Funktion <span class="function"><a href="function.imagerotate.php" class="function">imagerotate()</a></span> wurde geändert.
    Der Parameter <code class="parameter">$ignore_transparent</code> wurde entfernt,
    da er seit PHP 5.5.0 ignoriert wurde.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.intl">
   <h4 class="title">Intl</h4>

   <p class="para">
    Die Funktion <span class="function"><a href="intldateformatter.settimezone.php" class="function">datefmt_set_timezone()</a></span> und ihr Alias, die
    Methode <span class="methodname"><a href="intldateformatter.settimezone.php" class="methodname">IntlDateformatter::setTimeZone()</a></span>, geben nun
    bei Erfolg <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> zurück; zuvor wurde <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> zurückgegeben.
   </p>

   <p class="para">
    Die Methode <span class="methodname"><a href="intlbreakiterator.settext.php" class="methodname">IntlBreakiterator::setText()</a></span> gibt nun
    bei Erfolg <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> und bei einem Fehler <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück; zuvor gab sie in
    beiden Fällen <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> zurück.
   </p>

   <p class="para">
    Die Methode <span class="methodname"><a href="intlchar.enumcharnames.php" class="methodname">IntlChar::enumCharNames()</a></span> gibt nun
    einen booleschen Wert zurück; zuvor gab sie bei Erfolg <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> und bei
    einem Fehler <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück.
   </p>

   <p class="para">
    Die Methode <span class="methodname"><a href="intldateformatter.create.php" class="methodname">IntlDateFormatter::__construct()</a></span> wirft
    eine <strong><code><a href="intl.constants.php#constant.u-illegal-argument-error">U_ILLEGAL_ARGUMENT_ERROR</a></code></strong>-Exception, wenn eine
    ungültige Locale gesetzt gesetzt wurde.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.mbstring">
   <h4 class="title">MBString</h4>

   <p class="para">
    Die Funktionen <span class="function"><a href="function.mb-strtolower.php" class="function">mb_strtolower()</a></span> und
    <span class="function"><a href="function.mb-convert-case.php" class="function">mb_convert_case()</a></span> implementieren für den griechischen
    Buchstaben Sigma die Regeln der bedingten Groß- und Kleinschreibung. Bei
    der Funktion <span class="function"><a href="function.mb-convert-case.php" class="function">mb_convert_case()</a></span> gilt die bedingte
    Groß-/Kleinschreibung nur für die Modi <strong><code><a href="mbstring.constants.php#constant.mb-case-lower">MB_CASE_LOWER</a></code></strong>
    und <strong><code><a href="mbstring.constants.php#constant.mb-case-title">MB_CASE_TITLE</a></code></strong>, nicht aber für
    <strong><code><a href="mbstring.constants.php#constant.mb-case-lower-simple">MB_CASE_LOWER_SIMPLE</a></code></strong> und
    <strong><code><a href="mbstring.constants.php#constant.mb-case-title-simple">MB_CASE_TITLE_SIMPLE</a></code></strong>.
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="function.mb-decode-mimeheader.php" class="function">mb_decode_mimeheader()</a></span> interpretiert
    Unterstriche in QPrint-kodierten MIME-kodierten Wörtern gemäß RFC 2047 und
    wandelt sie in Leerzeichen um. Unterstriche müssen in solchen
    MIME-kodierten Wörtern als <code class="literal">&quot;=5F&quot;</code> kodiert werden.
   </p>

   <p class="para">
    In seltenen Fällen kodiert die Funktion
    <span class="function"><a href="function.mb-encode-mimeheader.php" class="function">mb_encode_mimeheader()</a></span> die Eingabezeichenkette um,
    während sie in PHP 8.2 als reines ASCII durchgereicht würde.
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="function.mb-encode-mimeheader.php" class="function">mb_encode_mimeheader()</a></span> entfernt keine NUL-
    (Null) Bytes mehr, wenn die Eingabezeichenkette in Qprint-Kodierung
    vorliegt. Dies führte in früheren Versionen bei bestimmten Textkodierungen,
    insbesondere UTF-16 und UTF-32, dazu, dass Zeichenketten von
    mb_encode_mimeheader beschädigt wurden.
   </p>

   <p class="para">
    Der &quot;non-strict&quot;-Modus der Funktion <span class="function"><a href="function.mb-detect-encoding.php" class="function">mb_detect_encoding()</a></span>
    verhält sich nun wie in der Dokumentation beschrieben. Zuvor gab sie
    <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück, wenn ein bestimmtes Byte (z. B. das Erste) der
    Eingabezeichenkette in allen möglichen Kodierungen ungültig war.
    Allgemeiner ausgedrückt: Alle in Frage kommenden Kodierungen, in denen ein
    solches Byte ungültig war, wurden ausgeschlossen, und wenn dasselbe Byte
    alle verbleibenden Kodierungen ausschloss, die noch in Frage kamen, wurde
    <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurückgegeben. Wurden hingegen alle in Frage kommenden Kodierungen
    bis auf eine ausgeschlossen, wurde die letzte verbleibende Kodierung
    zurückgegeben, ohne Rücksicht darauf, wie viele Kodierungsfehler später in
    der Zeichenkette auftreten könnten. Dies unterscheidet sich von dem in der
    Dokumentation beschriebenen Verhalten, das besagt: &quot;Wenn strict auf false
    gesetzt ist, wird die am besten passende Kodierung zurückgegeben.&quot;
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.mysqli">
   <h4 class="title">mysqli</h4>

   <p class="para">
    Die Funktion <span class="function"><a href="mysqli-result.fetch-object.php" class="function">mysqli_fetch_object()</a></span> wirft nun einen
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> statt einer
    <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>, wenn das Argument
    <code class="parameter">$constructor_args</code> nicht leer ist, die Klasse aber
    keinen Konstruktor hat.
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="mysqli.poll.php" class="function">mysqli_poll()</a></span> wirft nun einen
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>, wenn weder das Argument
    <code class="parameter">$read</code> noch das Argument
    <code class="parameter">$error</code> übergeben wird.
   </p>

   <p class="para">
    Der Rückgabetyp der Funktion <span class="function"><a href="mysqli-result.field-seek.php" class="function">mysqli_field_seek()</a></span> und
    der Methode <span class="methodname"><a href="mysqli-result.field-seek.php" class="methodname">mysqli_result::field_seek()</a></span> wurde von
    <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> auf <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> geändert.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.odbc">
   <h4 class="title">ODBC</h4>

   <p class="para">
    Die Funktion <span class="function"><a href="function.odbc-autocommit.php" class="function">odbc_autocommit()</a></span> akzeptiert nun <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>
    als Wert für den Parameter <code class="parameter">$enable</code>. Die Übergabe
    von <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> entspricht der Übergabe von nur einem Parameter, d. h. die
    Funktion zeigt an, ob autocommit aktiviert ist oder nicht.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.pgsql">
   <h4 class="title">PGSQL</h4>

   <p class="para">
    Die Funktion <span class="function"><a href="function.pg-fetch-object.php" class="function">pg_fetch_object()</a></span> wirft nun einen
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> statt einer
    <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>, wenn das Argument
    <code class="parameter">$constructor_args</code> nichtleer ist, die Klasse aber
    keinen Konstruktor hat.
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="function.pg-insert.php" class="function">pg_insert()</a></span> wirft nun einen
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> statt eine
    <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>-Meldung auszugeben, wenn die angegebene
    Tabelle ungültig ist.
   </p>

   <p class="para">
    Wenn der Wert/Typ eines Feldes nicht mit dem PostgreSQL-Typ übereinstimmt,
    werfen die Funktionen <span class="function"><a href="function.pg-insert.php" class="function">pg_insert()</a></span> und
    <span class="function"><a href="function.pg-convert.php" class="function">pg_convert()</a></span> einen <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>
    oder einen <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>, statt eine
    <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>-Meldung auszugeben.
   </p>

   <p class="para">
    Bei den Funktionen <span class="function"><a href="function.pg-fetch-result.php" class="function">pg_fetch_result()</a></span>,
    <span class="function"><a href="function.pg-field-prtlen.php" class="function">pg_field_prtlen()</a></span> und
    <span class="function"><a href="function.pg-field-is-null.php" class="function">pg_field_is_null()</a></span> kann der Wert des Parameters
    <code class="parameter">$row</code> nun <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> sein.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.random">
   <h4 class="title">Random</h4>

   <p class="para">
    Die Funktionen <span class="function"><a href="function.mt-srand.php" class="function">mt_srand()</a></span> und <span class="function"><a href="function.srand.php" class="function">srand()</a></span>
    prüfen nun nicht mehr die Anzahl der Argumente, um festzustellen, ob ein
    Zufallswert (Seed) verwendet werden soll. Wenn <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> übergeben wird, wird
    ein Seed erzeugt, bei <code class="literal">0</code> wird Null als Seed verwendet.
    Damit entspricht das Verhalten dieser Funktionen dem der Methode
    <span class="methodname"><a href="random-engine-mt19937.construct.php" class="methodname">Random\Engine\Mt19937::__construct()</a></span>.
   </p>

  </div>

  <div class="sect3" id="migration83.other-changes.functions.reflection">
   <h4 class="title">Reflection</h4>

   <p class="para">
    Der Rückgabetyp der Methode
    <span class="methodname"><a href="reflectionclass.getstaticproperties.php" class="methodname">ReflectionClass::getStaticProperties()</a></span> kann nicht
    mehr <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> sein.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.standard">
   <h4 class="title">Standard</h4>

   <p class="para">
    Bei der Funktion <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> wurden Meldungen der
    Stufe <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> auf <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>
    hochgestuft.
    
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> gibt nun eine neue Meldung
    der Stufe <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> aus, wenn nicht alle Bytes der
    Eingabe verarbeitet wurden.
    
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="function.array-pad.php" class="function">array_pad()</a></span> ist nun nur noch durch die
    maximale Anzahl der Elemente begrenzt, die ein Array haben kann; zuvor
    konnten nur maximal 1048576 Elemente auf einmal hinzugefügt werden.
   </p>

   <p class="para">
    Die Funktion <span class="function"><a href="function.strtok.php" class="function">strtok()</a></span> erzeugt eine Meldung der Stufe
    <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>, wenn beim Start der Tokenisierung kein
    Token angegeben wird.
   </p>

   <p class="para">
    Wenn die Erzeugung des Salt fehlschlägt, verkettet die Funktion
    <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> nun die zugrundeliegende
    <span class="classname"><a href="class.random-randomexception.php" class="classname">Random\RandomException</a></span> als
    <code class="parameter">$previous</code>-<span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> der
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>-Exception.
   </p>

   <p class="para">
    Wenn ein Array als Parameter <code class="parameter">$command</code> an die
    Funktion <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> übergeben wird, muss es nun
    mindestens ein nichtleeres Element enthalten; andernfalls wird ein
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> geworfen.
   </p>

   <p class="para">
    Wenn das <code class="parameter">$command</code>-Array ein ungültiger Befehl ist,
    gibt die Funktion <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück, statt ein
    Ressourcenobjekt, das später eine Warnung erzeugt. Dies war unter Windows
    bereits der Fall und ist nun auch der Fall, wenn eine
    posix_spawn-Implementierung verwendet wird (die meisten Linux-, BSD- und
    MacOS-Plattformen). Es gibt noch ein paar alte Plattformen, bei denen sich
    dieses Verhalten nicht geändert hat, da posix_spawn dort nicht unterstützt
    wird.
   </p>

   <p class="para">
    Die Funktionen <span class="function"><a href="function.array-sum.php" class="function">array_sum()</a></span> und
    <span class="function"><a href="function.array-product.php" class="function">array_product()</a></span> geben nun eine Warnung aus, wenn Werte
    in einem Array nicht in int/float umgewandelt werden können. Zuvor wurden
    Arrays und Objekte ignoriert, während alle anderen Werte in int
    umgewandelt wurden. Außerdem werden Objekte, die eine Umwandlung in eine
    Zahl definieren (z. B. <a href="book.gmp.php" class="link">GMP</a>), nun umgewandelt
    statt ignoriert.
    
   </p>

   <p class="para">
    Der Parameter <code class="parameter">$decimals</code> der Funktion
    <span class="function"><a href="function.number-format.php" class="function">number_format()</a></span> verarbeitet nun auch negative Zahlen
    korrekt. Wenn <code class="parameter">$decimals</code> einen negativen Wert hat,
    wird <code class="parameter">$num</code> auf <code class="parameter">$decimals</code>
    signifikante Stellen vor dem Dezimaltrennzeichen gerundet. Zuvor wurden
    negative <code class="parameter">$decimals</code> stillschweigend ignoriert und
    die Zahl wurde auf null Dezimalstellen gerundet.
   </p>

   <p class="para">
    Der Funktion <span class="function"><a href="function.strrchr.php" class="function">strrchr()</a></span> wurde der neue Parameter
    <code class="parameter">$before_needle</code> hinzugefügt. Er verhält sich wie der
    entsprechende Parameter der Funktionen <span class="function"><a href="function.strstr.php" class="function">strstr()</a></span> und
    <span class="function"><a href="function.stristr.php" class="function">stristr()</a></span>.
   </p>

   <p class="para">
    Die Funktionen <span class="function"><a href="function.str-getcsv.php" class="function">str_getcsv()</a></span> und
    <span class="function"><a href="function.fgetcsv.php" class="function">fgetcsv()</a></span> geben nun für das letzte Feld eine leere
    Zeichenkette statt einer Zeichenkette mit einem einzelnen Null-Byte
    zurück, wenn dieses Feld nur eine nicht terminierte Enclosure
    (Einschließung) enthält.
   </p>
  </div>

 </div>

 <div class="sect2" id="migration83.other-changes.extensions">
  <h3 class="title">Sonstige Änderungen bei Erweiterungen</h3>

  <div class="sect3" id="migration83.other-changes.extensions.core">
   <h4 class="title">Core</h4>

   <p class="para">
    Die Anwendung des
    <a href="language.operators.increment.php" class="link">Inkrement/Dekrement</a>-Operators
    (<code class="literal">++</code>/<code class="literal">--</code>) auf einen Wert vom Typ
    <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> führt nun zu einer Warnung. Der Grund dafür ist, dass
    dieser Operator zwar derzeit keine Wirkung hat, sich aber in Zukunft wie
    <code class="code">$bool += 1</code> verhalten wird.
   </p>

   <p class="para">
    Die Anwendung des
    <a href="language.operators.increment.php" class="link">Dekrement</a>-Operators
    (<code class="literal">--</code>) auf einen Wert vom Typ <span class="type"><a href="language.types.null.php" class="type null">null</a></span> führt nun
    zu einer Warnung. Der Grund dafür ist, dass dieser Operator zwar derzeit
    keine Wirkung hat, sich aber in Zukunft wie <code class="code">$null -= 1</code>
    verhalten wird.
   </p>

   <p class="para">
    Interne Objekte, die die _IS_NUMBER-Umwandlung implementieren, aber keinen
    do_operator-Handler, der die Addition und Subtraktion überschreibt, können
    nun inkrementiert und dekrementiert werden, als ob <code class="code">$o += 1</code>
    oder <code class="code">$o -= 1</code> ausgeführt worden wäre.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.extensions.dom">
   <h4 class="title">DOM</h4>

   <p class="para">
    Der DOM-Mechanismus zur Verwaltung der Lebensdauer wurde dahingehend
    überarbeitet, dass implizit gelöschte Knoten weiterhin abgerufen werden
    können; zuvor führte dies zu einer Exception.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.extensions.sqlite3">
   <h4 class="title">SQLite3</h4>

   <p class="para">
    Die Klasse <span class="classname"><a href="class.sqlite3.php" class="classname">SQLite3</a></span> wirft nun eine
    <span class="classname"><a href="class.sqlite3exception.php" class="classname">SQLite3Exception</a></span> (eine Erweiterung von
    <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>) statt einer
    <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>.
   </p>

   <p class="para">
    Der SQLite-Fehlercode wird nun im Fehlercode der Exception übergeben,
    statt in der Fehlermeldung enthalten zu sein.
   </p>

  </div>
 </div>

 <div class="sect2" id="migration83.other-changes.ini">
  <h3 class="title">Änderungen bei der Handhabung von INI-Dateien</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die <code class="literal">assert.*</code>-INI-Direktiven sind veraltet.
     Dies betrifft die folgenden Direktiven:
     <ul class="simplelist">
      <li><a href="info.configuration.php#ini.assert.active" class="link">assert.active</a></li>
      <li><a href="info.configuration.php#ini.assert.bail" class="link">assert.bail</a></li>
      <li><a href="info.configuration.php#ini.assert.callback" class="link">assert.callback</a></li>
      <li><a href="info.configuration.php#ini.assert.exception" class="link">assert.exception</a></li>
      <li><a href="info.configuration.php#ini.assert.warning" class="link">assert.warning</a></li>
     </ul>
     Wenn der Wert einer Direktive mit dem Standardwert übereinstimmt, wird
     keine Meldung über die Missbilligung ausgegeben.
     Statt dieser Direktiven sollte die INI-Direktive
     <a href="ini.core.php#ini.zend.assertions" class="link">zend.assertions</a> verwendet werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <a href="info.configuration.php#ini.zend.max-allowed-stack-size" class="link">zend.max_allowed_stack_size</a>
     ist eine neue INI-Direktive, mit der die maximal erlaubte Stackgröße
     festgelegt werden kann; mögliche Werte sind <code class="literal">0</code> (erkennt
     die maximale Stackgröße des Prozesses oder Threads), <code class="literal">-1</code>
     (kein Limit) oder eine positive Anzahl von Bytes. Der Standardwert ist
     <code class="literal">0</code>. Wenn es nicht möglich ist, die maximale Stackgröße
     des Prozesses oder Threads zu ermitteln, wird eine bekannte Systemvorgabe
     verwendet. Wird dieser Wert zu hoch eingestellt, hat das den gleichen
     Effekt wie die Deaktivierung der Stack-Größenbegrenzung. Fibers verwenden
     <a href="info.configuration.php#ini.fiber.stack-size" class="link">fiber.stack_size</a> als maximal
     erlaubte Stackgröße.
     Wenn der Stack des Prozessaufrufs
     <a href="info.configuration.php#ini.zend.max-allowed-stack-size" class="link">zend.max_allowed_stack_size</a>-<a href="info.configuration.php#ini.zend.reserved-stack-size" class="link">zend.reserved_stack_size</a>
     Bytes überschreitet, wird ein <span class="classname"><a href="class.error.php" class="classname">Error</a></span> geworfen, um
     Segmentierungsfehler durch Stack-Überlauf zu verhindern und damit die
     Fehlersuche zu erleichtern. Die Stackgröße erhöht sich während
     unkontrollierter Rekursionen mit internen Funktionen oder den magischen
     Methoden
     <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>,
     <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>,
     <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a>,
     <a href="language.oop5.decon.php#object.destruct" class="link">__destruct()</a>.
     Dies hat nichts mit Stack-Pufferüberläufen zu tun und ist somit auch keine
     Sicherheitsmaßnahme.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <a href="info.configuration.php#ini.zend.reserved-stack-size" class="link">zend.reserved_stack_size</a>
     ist eine neue INI-Direktive, mit der die zu reservierende Stackgröße in
     Bytes festgelegt werden kann. Wenn die Stackgröße überprüft wird, wird
     dieser Wert als Puffer von der maximal erlaubten Stackgröße abgezogen.
    </p>
   </li>
   </ul>
 </div>

 <div class="sect2" id="migration83.other-changes.performance">
  <h3 class="title">Performance</h3>

  <div class="sect3" id="migration83.other-changes.performance.dom">
   <h4 class="title">DOM</h4>

   <p class="para">
    Beim Durchlaufen einer Schleife über eine
    <span class="classname"><a href="class.domnodelist.php" class="classname">DOMNodeList</a></span> wird nun ein Zwischenspeicher
    verwendet. Dadurch steigt die Zeit, die für die Abfrage von Elementen
    benötigt wird, nicht mehr standardmäßig quadratisch an.
   </p>

   <p class="para">
    Wenn Textinhalte von Knoten abgerufen werden, wird nun vermieden, Speicher
    zuzuweisen, was zu einem Leistungsgewinn führt.
   </p>

   <p class="para">
    <span class="methodname"><a href="domchildnode.remove.php" class="methodname">DOMChildNode::remove()</a></span> läuft nun mit
    O(1)-Performance.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.performance.standard">
   <h4 class="title">Standard</h4>

   <p class="para">
    Die flags-Fehlerprüfung der Funktion <span class="function"><a href="function.file.php" class="function">file()</a></span> ist nun
    etwa 7% schneller.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.performance.spl">
   <h4 class="title">SPL</h4>

   <p class="para">
    Die Klasse <span class="classname"><a href="class.recursivedirectoryiterator.php" class="classname">RecursiveDirectoryIterator</a></span> führt nun
    weniger I/O (Ein-/Ausgabeoperationen) durch, wenn ein Verzeichnis in einer
    Schleife durchlaufen wird.
   </p>
  </div>
 </div>

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