<?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.new-features.php',
    1 => 'Neue Features',
    2 => 'Neue Features',
  ),
  'up' => 
  array (
    0 => 'migration80.php',
    1 => 'Migration von PHP 7.4.x auf PHP 8.0.x',
  ),
  'prev' => 
  array (
    0 => 'migration80.php',
    1 => 'Migration von PHP 7.4.x auf PHP 8.0.x',
  ),
  'next' => 
  array (
    0 => 'migration80.new-classes.php',
    1 => 'Neue Klassen und Schnittstellen',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'appendices/migration80/new-features.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration80.new-features" class="sect1">
 <h2 class="title">Neue Features</h2>

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

  <div class="sect3" id="migration80.new-features.core.named-arguments">
   <h4 class="title">Benannte Parameter</h4>

   <p class="para">
    
    Die Unterstützung für
    <a href="functions.arguments.php#functions.named-arguments" class="link">benannte Parameter</a> wurde
    hinzugefügt.
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.attributes">
   <h4 class="title">Attribute</h4>

   <p class="para">
    Die Unterstützung für
    <a href="language.attributes.php" class="link">Attribute</a> wurde
    hinzugefügt.
    
    
    
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.property-promotion">
   <h4 class="title">Beförderung von Konstruktoreigenschaften</h4>

   <p class="para">
    Die Unterstützung für die
    <a href="language.oop5.decon.php#language.oop5.decon.constructor.promotion" class="link">Beförderung von Konstruktoreigenschaften</a>
    (Deklaration von Eigenschaften in der Konstruktorsignatur) wurde
    hinzugefügt.
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.union-types">
   <h4 class="title">Zusammengefasste Typen (Union-Typen)</h4>

   <p class="para">
    Die Unterstützung für
    <a href="language.types.declarations.php#language.types.declarations.composite.union" class="link">zusammengefasste Typen</a>
    wurde hinzugefügt.
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.match">
   <h4 class="title">Ausdruck match</h4>

   <p class="para">
    Die Unterstützung für den
    <a href="control-structures.match.php" class="link">Ausdruck <code class="literal">match</code></a>
    wurde hinzugefügt.
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.nullsafe-operator">
   <h4 class="title">Nullsafe-Operator</h4>

   <p class="para">
    Die Unterstützung für den
    <a href="language.oop5.basic.php#language.oop5.basic.nullsafe" class="link">nullsafe-Operator</a>
    (<code class="literal">?-&gt;</code>) wurde hinzugefügt.
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.others">
   <h4 class="title">Andere neue Features</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      Die Klasse <a href="class.weakmap.php" class="link">WeakMap</a> wurde
      hinzugefügt.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Klasse <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> wurde hinzugefügt.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Eine beliebige Anzahl von Funktionsparametern kann nun durch einen
      variadischen Parameter ersetzt werden, solange die Typen kompatibel
      sind. Zum Beispiel ist der folgende Code nun erlaubt:
     </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">A </span><span style="color: #007700">{<br />     public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(</span><span style="color: #0000BB">int $many</span><span style="color: #007700">, </span><span style="color: #0000BB">string $parameters</span><span style="color: #007700">, </span><span style="color: #0000BB">$here</span><span style="color: #007700">) {}<br />}<br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />     public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(...</span><span style="color: #0000BB">$everything</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">
      <span class="type">static</span> (wie in &quot;late static binding&quot;, späte statische
      Bindung) kann nun als Rückgabetyp 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: #007700">class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{<br />     public function </span><span style="color: #0000BB">create</span><span style="color: #007700">(): static {<br />          return new static();<br />     }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Es ist nun möglich, den Klassennamen eines Objekts mit Hilfe von
      <code class="code">$object::class</code> zu ermitteln. Das Ergebnis ist dasselbe wie
      bei <code class="code">get_class($object)</code>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <a href="language.oop5.basic.php#language.oop5.basic.new" class="link"><code class="literal">new</code></a> und <a href="language.operators.type.php" class="link"><code class="literal">instanceof</code></a> können nun durch Verwendung von
      <code class="code">new (Ausdruck)(...$args)</code> und
      <code class="code">$obj instanceof (Ausdruck)</code> mit beliebigen Ausdrücken
      verwendet werden.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Es wurden einige Verbesserungen an der Einheitlichkeit der
      Variablensyntax vorgenommen, zum Beispiel ist Folgendes nun erlaubt:
      <code class="code">Foo::BAR::$baz</code>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Schnittstelle <span class="interfacename"><a href="class.stringable.php" class="interfacename">Stringable</a></span> wurde
      hinzugefügt. Sie wird automatisch implementiert, wenn eine Klasse eine
      <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>-Methode definiert.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Traits können nun abstrakte private Methoden definieren. Diese Methoden
      müssen von der Klasse implementiert werden, die den Trait verwendet.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">throw</code> kann nun als Ausdruck verwendet werden. Das
      ermöglicht Verwendungen wie:
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$fn </span><span style="color: #007700">= fn() =&gt; throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Exception in der Pfeilfunktion'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$user </span><span style="color: #007700">= </span><span style="color: #0000BB">$session</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">user </span><span style="color: #007700">?? throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Muss einen Benutzer haben'</span><span style="color: #007700">);</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      In Parameterlisten ist nun ein optionales Komma am Ende erlaubt.
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">functionWithLongSignature</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">Type1 $parameter1</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">Type2 $parameter2</span><span style="color: #007700">, </span><span style="color: #FF8000">// &lt;-- Dieses Komma ist nun erlaubt.<br /></span><span style="color: #007700">) {<br />}</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Es ist nun möglich, <code class="code">catch (Exception)</code> zu schreiben, um eine
      Ausnahme abzufangen, ohne sie in einer Variablen zu speichern.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Unterstützung für den Typ <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> wurde hinzugefügt.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Private Methoden, die in einer übergeordneten Klasse deklariert wurden,
      erzwingen für die Methoden einer Kindklasse keine Vererbungsregeln mehr
      (mit Ausnahme von finalen privaten Konstruktoren). Das folgende Beispiel
      veranschaulicht, welche Einschränkungen aufgehoben wurden:
      <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">ParentClass </span><span style="color: #007700">{<br />    private function </span><span style="color: #0000BB">method1</span><span style="color: #007700">() {}<br />    private function </span><span style="color: #0000BB">method2</span><span style="color: #007700">() {}<br />    private static function </span><span style="color: #0000BB">method3</span><span style="color: #007700">() {}<br />    </span><span style="color: #FF8000">// Löst eine Warnung aus, da "final" keine Bedeutung mehr hat:<br />    </span><span style="color: #007700">private final function </span><span style="color: #0000BB">method4</span><span style="color: #007700">() {}<br />}<br />class </span><span style="color: #0000BB">ChildClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">ParentClass </span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Alles Folgende ist nun erlaubt, auch wenn die Modifikatoren nicht<br />    // dieselben sind wie bei den privaten Methoden in der Elternklasse.<br />    </span><span style="color: #007700">public abstract function </span><span style="color: #0000BB">method1</span><span style="color: #007700">() {}<br />    public static function </span><span style="color: #0000BB">method2</span><span style="color: #007700">() {}<br />    public function </span><span style="color: #0000BB">method3</span><span style="color: #007700">() {}<br />    public function </span><span style="color: #0000BB">method4</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">
      Die Funktion <span class="function"><a href="function.get-resource-id.php" class="function">get_resource_id()</a></span> wurde hinzugefügt. Sie
      gibt denselben Wert zurück wie <code class="code">(int) $resource</code> und bietet
      dieselbe Funktionalität mit einer übersichtlicheren API.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Die Klasse <span class="classname"><a href="class.internaliterator.php" class="classname">InternalIterator</a></span> wurde hinzugefügt.
     </p>
    </li>
   </ul>
  </div>
 </div>

 <div class="sect2" id="migration80.new-features.date">
  <h3 class="title">Datum und Uhrzeit</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Methoden <span class="methodname"><a href="datetime.createfrominterface.php" class="methodname">DateTime::createFromInterface()</a></span> und
     <span class="methodname"><a href="datetimeimmutable.createfrominterface.php" class="methodname">DateTimeImmutable::createFromInterface()</a></span> wurden
     hinzugefügt.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Für DateTime wurde die Formatangabe <code class="literal">p</code> hinzugefügt, die
     ähnlich ist wie <code class="literal">P</code>, aber für UTC <code class="literal">Z</code>
     anstelle von <code class="literal">+00:00</code> zurückgibt.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.new-features.dom">
  <h3 class="title">DOM</h3>

  <p class="para">
   Die Schnittstellen <span class="interfacename"><a href="class.domparentnode.php" class="interfacename">DOMParentNode</a></span> und
   <span class="interfacename"><a href="class.domchildnode.php" class="interfacename">DOMChildNode</a></span> mit neuen Traversal- und
   Kontroll-APIs wurden hinzugefügt.
   
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.filter">
  <h3 class="title">Filter</h3>

  <p class="para">
   <strong><code><a href="filter.constants.php#constant.filter-validate-bool">FILTER_VALIDATE_BOOL</a></code></strong> wurde als Alias für
   <strong><code><a href="filter.constants.php#constant.filter-validate-boolean">FILTER_VALIDATE_BOOLEAN</a></code></strong> hinzugefügt. Der neue Name
   sollte bevorzugt werden, weil er den kanonischen Typnamen verwendet.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.enchant">
  <h3 class="title">Enchant</h3>

  <p class="para">
   Die Funktionen <span class="function"><a href="function.enchant-dict-add.php" class="function">enchant_dict_add()</a></span>,
   <span class="function"><a href="function.enchant-dict-is-added.php" class="function">enchant_dict_is_added()</a></span> und die Konstante
   <strong><code><a href="enchant.constants.php#constant.libenchant-version">LIBENCHANT_VERSION</a></code></strong> wurden hinzugefügt.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.fpm">
  <h3 class="title">FPM</h3>

  <p class="para">
   Die neue Option <code class="literal">pm.status_listen</code> wurde hinzugefügt. Sie
   ermöglicht es, den Status von einem anderen Endpunkt zu erhalten (z. B. Port
   oder UDS-Datei). Dies ist nützlich, um den Status zu erhalten, wenn alle
   Kindprozesse mit der Bearbeitung lang laufender Anfragen beschäftigt sind.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.hash">
  <h3 class="title">Hash</h3>

  <p class="para">
   <span class="classname"><a href="class.hashcontext.php" class="classname">HashContext</a></span>-Objekte können nun serialisiert werden.
  </p>
 </div>

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

  <p class="para">
   Die Konstanten <strong><code><a href="class.intldateformatter.php#intldateformatter.constants.relative-full">IntlDateFormatter::RELATIVE_FULL</a></code></strong>,
   <strong><code><a href="class.intldateformatter.php#intldateformatter.constants.relative-long">IntlDateFormatter::RELATIVE_LONG</a></code></strong>,
   <strong><code><a href="class.intldateformatter.php#intldateformatter.constants.relative-medium">IntlDateFormatter::RELATIVE_MEDIUM</a></code></strong> und
   <strong><code><a href="class.intldateformatter.php#intldateformatter.constants.relative-short">IntlDateFormatter::RELATIVE_SHORT</a></code></strong> wurden hinzugefügt.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.ldap">
  <h3 class="title">LDAP</h3>

  <p class="para">
   Die Funktion <span class="function"><a href="function.ldap-count-references.php" class="function">ldap_count_references()</a></span> wurde hinzugefügt;
   sie gibt die Anzahl der Referenzmeldungen in einem Suchergebnis zurück.

  </p>
 </div>
 <div class="sect2" id="migration80.new-features.opcache">
  <h3 class="title">OPcache</h3>

  <p class="para">
   Wenn die ini-Einstellung
   opcache.record_warnings
   aktiviert ist, zeichnet OPcache die Warnungen auf, die bei der Kompilierung
   auftreten, und gibt sie beim nächsten Include wieder, auch wenn sie aus dem
   Cache geliefert werden.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.openssl">
  <h3 class="title">OpenSSL</h3>

  <p class="para">
   Die Unterstützung für die Cryptographic Message Syntax (CMS)
   (<a href="https://datatracker.ietf.org/doc/html/rfc5652" class="link external">&raquo;&nbsp;RFC 5652</a>), die aus Funktionen zum
   Verschlüsseln, Entschlüsseln, Signieren, Überprüfen und Lesen besteht,
   wurde hinzugefügt. Die API ist der API für
   <abbr title="Public Key Cryptography Standards">PKCS</abbr>-#7-Funktionen ähnlich und enthält darüber hinaus
   folgende neue Verschlüsselungskonstanten:
   <strong><code><a href="openssl.constants.other.php#constant.openssl-encoding-der">OPENSSL_ENCODING_DER</a></code></strong>,
   <strong><code><a href="openssl.constants.other.php#constant.openssl-encoding-smime">OPENSSL_ENCODING_SMIME</a></code></strong> und
   <strong><code><a href="openssl.constants.other.php#constant.openssl-encoding-pem">OPENSSL_ENCODING_PEM</a></code></strong>:
   <ul class="simplelist">
    <li>
     <span class="function"><a href="function.openssl-cms-encrypt.php" class="function">openssl_cms_encrypt()</a></span> verschlüsselt die Nachricht in
     der Datei mit den Zertifikaten und gibt das Ergebnis in der angegebenen
     Datei aus.
    </li>
    <li>
     <span class="function"><a href="function.openssl-cms-decrypt.php" class="function">openssl_cms_decrypt()</a></span> entschlüsselt die
     S/MIME-Nachricht in der Datei und gibt das Ergebnis in der angegebenen
     Datei aus.
    </li>
    <li>
     <span class="function"><a href="function.openssl-cms-read.php" class="function">openssl_cms_read()</a></span> exportiert die CMS-Datei in ein
     Array von <abbr title="Privacy-Enhanced Mail">PEM</abbr>-Zertifikaten.
    </li>
    <li>
     <span class="function"><a href="function.openssl-cms-sign.php" class="function">openssl_cms_sign()</a></span> signiert die MIME-Nachricht in der
     Datei mit einem Zertifikat und einem Schlüssel und gibt das Ergebnis in
     der angegebenen Datei aus.
    </li>
    <li>
     <span class="function"><a href="function.openssl-cms-verify.php" class="function">openssl_cms_verify()</a></span> verifiziert, dass der Datenblock
     intakt ist, der Unterzeichner der ist, für den er sich ausgibt, und gibt
     die Zertifikate der Unterzeichner zurück.
    </li>
   </ul>
  </p>
 </div>

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

  <p class="para">
   Die Funktion <span class="function"><a href="function.preg-last-error-msg.php" class="function">preg_last_error_msg()</a></span> wurde hinzugefügt.
   Sie gibt eine menschenlesbare Meldung für den letzten PCRE-Fehler zurück
   und ergänzt die Funktion <span class="function"><a href="function.preg-last-error.php" class="function">preg_last_error()</a></span>, die einen
   Integer-Enum-Wert zurückgibt.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.reflection">
  <h3 class="title">Reflection</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die folgenden Methoden können nun Informationen über die Standardwerte
     der Parameter interner Funktionen zurückgeben:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="methodname"><a href="reflectionparameter.isdefaultvalueavailable.php" class="methodname">ReflectionParameter::isDefaultValueAvailable()</a></span></li>
      <li><span class="methodname"><a href="reflectionparameter.getdefaultvalue.php" class="methodname">ReflectionParameter::getDefaultValue()</a></span></li>
      <li><span class="methodname"><a href="reflectionparameter.isdefaultvalueconstant.php" class="methodname">ReflectionParameter::isDefaultValueConstant()</a></span></li>
      <li><span class="methodname"><a href="reflectionparameter.getdefaultvalueconstantname.php" class="methodname">ReflectionParameter::getDefaultValueConstantName()</a></span></li>
     </ul>
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.new-features.sqlite3">
  <h3 class="title">SQLite3</h3>

  <p class="para">
   Die Methode <span class="methodname"><a href="sqlite3.setauthorizer.php" class="methodname">SQLite3::setAuthorizer()</a></span> und
   entsprechende Klassenkonstanten wurden hinzugefügt. Damit ist es möglich,
   eine benutzerdefinierte Callback-Funktion anzugeben, die verwendet wird, um
   eine Aktion in der Datenbank zu autorisieren oder nicht.
   
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.standard">
  <h3 class="title">Standard-Funktionsbibliothek</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.str-contains.php" class="function">str_contains()</a></span>,
     <span class="function"><a href="function.str-starts-with.php" class="function">str_starts_with()</a></span> und
     <span class="function"><a href="function.str-ends-with.php" class="function">str_ends_with()</a></span> wurden hinzugefügt. Sie prüfen, ob
     <code class="parameter">haystack</code> <code class="parameter">needle</code> enthält
     bzw. damit beginnt oder endet.
     
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.fdiv.php" class="function">fdiv()</a></span> wurde hinzugefügt. Sie führt eine
     Gleitkomma-Division nach IEEE 754-Semantik durch. Die Division durch Null
     wird als wohldefiniert betrachtet und gibt einen der Werte
     <code class="literal">Inf</code>, <code class="literal">-Inf</code> oder
     <code class="literal">NaN</code> zurück.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktion <span class="function"><a href="function.get-debug-type.php" class="function">get_debug_type()</a></span> wurde hinzugefügt. Sie
     gibt einen Typ zurück, der für Fehlermeldungen nützlich ist. Anders als
     <span class="function"><a href="function.gettype.php" class="function">gettype()</a></span> verwendet sie kanonische Typnamen, gibt
     die Klassennamen von Objekten zurück und nennt bei Ressourcen den
     Ressourcentyp.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.printf.php" class="function">printf()</a></span> und Freunde unterstützen nun
     die Formatangaben <code class="literal">%h</code> und <code class="literal">%H</code>. Diese
     sind vergleichbar mit <code class="literal">%g</code> und <code class="literal">%G</code>,
     verwenden aber immer <code class="literal">&quot;.&quot;</code> als Dezimaltrennzeichen,
     anstatt es durch die <strong><code><a href="string.constants.php#constant.lc-numeric">LC_NUMERIC</a></code></strong>-Locale zu bestimmen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.printf.php" class="function">printf()</a></span> und Freunde unterstützen nun
     die Verwendung von <code class="literal">&quot;*&quot;</code> als Breite oder Genauigkeit. In
     diesem Fall wird die Breite/Genauigkeit als Parameter an printf
     übergeben. Außerdem ermöglicht dies bei <code class="literal">%g</code>,
     <code class="literal">%G</code>, <code class="literal">%h</code> und <code class="literal">%H</code>
     die Verwendung der Genauigkeit <code class="literal">-1</code>. Zum Beispiel kann
     der folgende Code verwendet werden, um die standardmäßige
     Gleitkomma-Formatierung von PHP zu reproduzieren:
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%.*H"</span><span style="color: #007700">, (int) </span><span style="color: #0000BB">ini_get</span><span style="color: #007700">(</span><span style="color: #DD0000">"precision"</span><span style="color: #007700">), </span><span style="color: #0000BB">$float</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%.*H"</span><span style="color: #007700">, (int) </span><span style="color: #0000BB">ini_get</span><span style="color: #007700">(</span><span style="color: #DD0000">"serialize_precision"</span><span style="color: #007700">), </span><span style="color: #0000BB">$float</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">
     Die Funktion <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> unterstützt nun
     Pseudo-Terminal (PTY)-Deskriptoren. Das folgende hängt
     <code class="literal">stdin</code>, <code class="literal">stdout</code> und
     <code class="literal">stderr</code> an dasselbe PTY an:
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$proc </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$command</span><span style="color: #007700">, [[</span><span style="color: #DD0000">'pty'</span><span style="color: #007700">], [</span><span style="color: #DD0000">'pty'</span><span style="color: #007700">], [</span><span style="color: #DD0000">'pty'</span><span style="color: #007700">]], </span><span style="color: #0000BB">$pipes</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">
     <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> unterstützt nun Socket-Paar-Deskriptoren.
     Das folgende fügt ein bestimmtes Socket-Paar an <code class="literal">stdin</code>,
     <code class="literal">stdout</code> und <code class="literal">stderr</code> an:
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$proc </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$command</span><span style="color: #007700">, [[</span><span style="color: #DD0000">'socket'</span><span style="color: #007700">], [</span><span style="color: #DD0000">'socket'</span><span style="color: #007700">], [</span><span style="color: #DD0000">'socket'</span><span style="color: #007700">]], </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </p>
    <p class="para">
     Im Gegensatz zu Pipes gibt es bei Sockets unter Windows keine Probleme
     mit blockierenden I/Os. Allerdings funktionieren nicht alle Programme
     korrekt mit stdio-Sockets.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Sortierfunktionen verwenden nun eine stabile Sortierung. Das
     bedeutet, dass Elemente, die verglichen und für gleich befunden werden,
     ihre ursprüngliche Reihenfolge beibehalten.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Funktionen <span class="function"><a href="function.array-diff.php" class="function">array_diff()</a></span>,
     <span class="function"><a href="function.array-intersect.php" class="function">array_intersect()</a></span> und ihre Variationen können nun mit
     einem einzigen Array als Parameter verwendet werden. Das bedeutet, dass
     Verwendungen wie die folgende nun möglich sind:
    </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">// OK, auch wenn $excludes leer ist:<br /></span><span style="color: #0000BB">array_diff</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">, ...</span><span style="color: #0000BB">$excludes</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// OK, auch wenn $arrays nur ein einziges Array enthält:<br /></span><span style="color: #0000BB">array_intersect</span><span style="color: #007700">(...</span><span style="color: #0000BB">$arrays</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 Parameter <code class="parameter">flag</code> der Funktion
     <span class="function"><a href="function.ob-implicit-flush.php" class="function">ob_implicit_flush()</a></span> akzeptiert nun ein
     <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> anstelle eines <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.new-features.tokenizer">
  <h3 class="title">Tokenizer</h3>

  <p class="para">
   Die Klasse <span class="classname"><a href="class.phptoken.php" class="classname">PhpToken</a></span> fügt dem Tokenizer eine
   objektbasierte Schnittstelle hinzu. Diese Klasse bietet eine einheitlichere
   und ergonomischere Darstellung ist zudem speichereffizienter und schneller.
   
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.zip">
  <h3 class="title">Zip</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Die Erweiterung Zip wurde auf die Version 1.19.1 aktualisiert.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Neue Methoden <span class="methodname"><a href="ziparchive.setmtimename.php" class="methodname">ZipArchive::setMtimeName()</a></span> und
     <span class="methodname"><a href="ziparchive.setmtimeindex.php" class="methodname">ZipArchive::setMtimeIndex()</a></span>, um die Änderungszeit
     eines Eintrags festzulegen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Neue Methode
     <span class="methodname"><a href="ziparchive.registerprogresscallback.php" class="methodname">ZipArchive::registerProgressCallback()</a></span>, um
     Aktualisierungen beim Schließen eines Archivs bereitzustellen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Neue Methode <span class="methodname"><a href="ziparchive.registercancelcallback.php" class="methodname">ZipArchive::registerCancelCallback()</a></span>,
     um einen Abbruch während des Schließens eines Archivs zu ermöglichen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Neue Methode <span class="methodname"><a href="ziparchive.replacefile.php" class="methodname">ZipArchive::replaceFile()</a></span>, um den
     Inhalt eines Eintrags zu ersetzen
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Neue Methode
     <span class="methodname"><a href="ziparchive.iscompressionmethoddupported.php" class="methodname">ZipArchive::isCompressionMethodSupported()</a></span>, um auf
     optionale Komprimierungsfunktionen zu prüfen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Neue Methode
     <span class="methodname"><a href="ziparchive.isencryptionmethoddupported.php" class="methodname">ZipArchive::isEncryptionMethodSupported()</a></span>, um auf
     optionale Verschlüsselungsfunktionen zu prüfen.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Eigenschaft <var class="varname">ZipArchive::lastId</var> wurde hinzugefügt,
     um den Indexwert des zuletzt eingefügten Eintrags zu erhalten.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Mit den Eigenschaften <var class="varname">ZipArchive::status</var> und
     <var class="varname">ZipArchive::statusSys</var> oder der Methode
     <span class="methodname"><a href="ziparchive.getstatusstring.php" class="methodname">ZipArchive::getStatusString()</a></span> können nun Fehler
     nach dem Schließen eines Archivs überprüft werden.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Die Option <code class="literal">&#039;remove_path&#039;</code> der Methoden
     <span class="methodname"><a href="ziparchive.addglob.php" class="methodname">ZipArchive::addGlob()</a></span> und
     <span class="methodname"><a href="ziparchive.addpattern.php" class="methodname">ZipArchive::addPattern()</a></span> wird nun als beliebiges
     Zeichenketten-Präfix behandelt (um mit der Option
     <code class="literal">&#039;add_path&#039;</code> konsistent zu sein), während sie früher als
     Verzeichnisname behandelt wurde.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Optionale Komprimierungs- und Verschlüsselungsfunktionen werden nun in
     phpinfo aufgelistet.
    </p>
   </li>
  </ul>
 </div>

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