<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'migration74.new-features.php',
    1 => 'Nouvelles fonctionnalit&eacute;s',
    2 => 'Nouvelles fonctionnalit&eacute;s',
  ),
  'up' => 
  array (
    0 => 'migration74.php',
    1 => 'Migration de PHP 7.3.x vers PHP 7.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration74.php',
    1 => 'Migration de PHP 7.3.x vers PHP 7.4.x',
  ),
  'next' => 
  array (
    0 => 'migration74.new-classes.php',
    1 => 'Nouvelles Classes et Interfaces',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'appendices/migration74/new-features.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration74.new-features" class="sect1">
 <h2 class="title">Nouvelles fonctionnalités</h2>

 <div class="sect2" id="migration74.new-features.core">
  <h3 class="title">Cœur de PHP</h3>

  <div class="sect3" id="migration74.new-features.core.typed-properties">
   <h4 class="title">Propriétés typées</h4>

   <p class="para">
    Les propriétés des classes supportent désormais la déclaration du type.
    <div class="informalexample">
     <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">User </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">int $id</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    L&#039;exemple ci-dessus s&#039;assurera que <code class="literal">$user-&gt;id</code> ne peut
    se voir attribuer que des valeurs d&#039;<a href="language.types.integer.php" class="link">entier</a> et
    <code class="literal">$user-&gt;name</code> ne peut se voir attribuer que des valeurs
    <a href="language.types.string.php" class="link">chaîne de caractères</a>.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.arrow-functions">
   <h4 class="title">Fonctions flèches</h4>

   <p class="para">
    Les <a href="functions.arrow.php" class="link">fonctions flèches</a> fournissent
    une syntaxe courte pour définir des fonctions qui lient la portée par
    valeur implicitement.

    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$factor </span><span style="color: #007700">= </span><span style="color: #0000BB">10</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$nums </span><span style="color: #007700">= </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(fn(</span><span style="color: #0000BB">$n</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">$n </span><span style="color: #007700">* </span><span style="color: #0000BB">$factor</span><span style="color: #007700">, [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">]);<br /></span><span style="color: #FF8000">// $nums = array(10, 20, 30, 40);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.type-variance">
   <h4 class="title">Type de retour covariant et type d&#039;argument contravariant limité</h4>

   <p class="para">
    Le code suivant va désormais fonctionner :
    <div class="informalexample">
     <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 />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 /><br />class </span><span style="color: #0000BB">Producer </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(): </span><span style="color: #0000BB">A </span><span style="color: #007700">{}<br />}<br />class </span><span style="color: #0000BB">ChildProducer </span><span style="color: #007700">extends </span><span style="color: #0000BB">Producer </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(): </span><span style="color: #0000BB">B </span><span style="color: #007700">{}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    Le support de variance totale est seulement disponible quand l&#039;autoloading
    est utilisé. Dans un fichier unique seules des références de types non
    cycliques sont possibles, car toutes les classes doivent être disponibles
    avant qu&#039;elles soient référencées.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/**<br /> * Ces classes satisfont les exigences du LSP, car C est un sous-type de A.<br /> * Cependant, au moment où la classe B est déclarée, la classe C n'est pas encore disponible<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(): </span><span style="color: #0000BB">A </span><span style="color: #007700">{}<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Erreur fatale : Impossible de vérifier la compatibilité entre B::method():C et<br />    // A::method(): A, car la classe C n'est pas disponible<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(): </span><span style="color: #0000BB">С </span><span style="color: #007700">{}<br />}<br /><br />class </span><span style="color: #0000BB">C </span><span style="color: #007700">extends </span><span style="color: #0000BB">B </span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.null-coalescing-assignment-operator">
   <h4 class="title">Opérateur d&#039;assignation de fusion Null</h4>

   <p class="para">
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array</span><span style="color: #007700">[</span><span style="color: #DD0000">'key'</span><span style="color: #007700">] ??= </span><span style="color: #0000BB">computeDefault</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">// est à peu près équivalent à<br /></span><span style="color: #007700">if (!isset(</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">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">'key'</span><span style="color: #007700">] = </span><span style="color: #0000BB">computeDefault</span><span style="color: #007700">();<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.unpack-inside-array">
   <h4 class="title">Déballage dans les tableaux</h4>

   <p class="para">
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$parts </span><span style="color: #007700">= [</span><span style="color: #DD0000">'apple'</span><span style="color: #007700">, </span><span style="color: #DD0000">'pear'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$fruits </span><span style="color: #007700">= [</span><span style="color: #DD0000">'banana'</span><span style="color: #007700">, </span><span style="color: #DD0000">'orange'</span><span style="color: #007700">, ...</span><span style="color: #0000BB">$parts</span><span style="color: #007700">, </span><span style="color: #DD0000">'watermelon'</span><span style="color: #007700">];<br /></span><span style="color: #FF8000">// ['banana', 'orange', 'apple', 'pear', 'watermelon'];<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.numeric-literal-separator">
   <h4 class="title">Séparateur numérique littéral</h4>

   <p class="para">
    Les nombres littéraux peuvent contenir un caractère de soulignement entre
    les chiffres.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />6.674_083e-11</span><span style="color: #007700">; </span><span style="color: #FF8000">// float<br /></span><span style="color: #0000BB">299_792_458</span><span style="color: #007700">;   </span><span style="color: #FF8000">// decimal<br /></span><span style="color: #0000BB">0xCAFE_F00D</span><span style="color: #007700">;   </span><span style="color: #FF8000">// hexadecimal<br /></span><span style="color: #0000BB">0b0101_1111</span><span style="color: #007700">;   </span><span style="color: #FF8000">// binary<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>
 
  <div class="sect3" id="migration74.new-features.core.weakreference">
   <h4 class="title">Références faibles</h4>

   <p class="para">
    Les <a href="class.weakreference.php" class="link">références faibles</a> permettent au développeur de retenir une référence
    à un objet qui n&#039;empêche pas l&#039;objet d&#039;être détruit.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.tostring-exceptions">
   <h4 class="title">Autoriser des Exceptions depuis __toString()</h4>

   <p class="para">
    Lancer des exceptions depuis <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>
    est désormais permis. Précédemment, ceci résultait en une erreur fatale.
    Les erreurs fatales récupérables dans les conversions de <a href="language.types.string.php" class="link">chaîne de caractères</a> ont été
    converties en exceptions <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
   </p>
  </div>

 </div>

 <div class="sect2" id="migration74.new-features.curl">
  <h3 class="title">CURL</h3>
  
  <p class="para">
   <span class="classname"><a href="class.curlfile.php" class="classname">CURLFile</a></span> supporte désormais les enveloppes de flux
   en plus des noms de fichiers bruts, si l&#039;extension a été compilée avec libcurl
   &gt;= 7.56.0.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.filter">
  <h3 class="title">Filtre</h3>
  
  <p class="para">
   Le filtre <strong><code><a href="filter.constants.php#constant.filter-validate-float">FILTER_VALIDATE_FLOAT</a></code></strong> supporte désormais les
   options <code class="literal">min_range</code> et <code class="literal">max_range</code>,
   avec la même sémantique que <strong><code><a href="filter.constants.php#constant.filter-validate-int">FILTER_VALIDATE_INT</a></code></strong>.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.ffi">
  <h3 class="title">FFI</h3>

  <p class="para">
   FFI est une nouvelle extension, qui fournit une manière simple d&#039;appeler
   les fonctions natives, un accès natif aux variables, et la création/l&#039;accès à
   des structures de données définies dans des bibliothèques C.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.gd">
  <h3 class="title">GD</h3>

  <p class="para">
   Ajout du filtre d&#039;image <strong><code><a href="image.constants.php#constant.img-filter-scatter">IMG_FILTER_SCATTER</a></code></strong>
   pour appliquer un filtre à dispersions aux images.
  </p>
 </div>

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

  <p class="para">
   Ajout du hash <code class="literal">crc32c</code> utilisant le polynôme de Castagnoli.
   Cette variante de CRC32 est utilisée par les systèmes de stockage, tels que
   iSCSI, SCTP, Btrfs et ext4.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.mbstring">
  <h3 class="title">Chaînes multioctets</h3>

  <p class="para">
   Ajout de la fonction <span class="function"><a href="function.mb-str-split.php" class="function">mb_str_split()</a></span>, qui fournit la même
   fonctionnalité que <span class="function"><a href="function.str-split.php" class="function">str_split()</a></span>, mais opère sur des points
   de code au lieu d&#039;octets.
  </p>
 </div>

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

  <p class="para">
   <a href="opcache.preloading.php" class="link">Le support pour le préchargement de code</a> a été ajouté.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.pcre">
  <h3 class="title">Expressions Régulières (Compatible Perl)</h3>

  <p class="para">
   Les fonctions <span class="function"><a href="function.preg-replace-callback.php" class="function">preg_replace_callback()</a></span> et
   <span class="function"><a href="function.preg-replace-callback-array.php" class="function">preg_replace_callback_array()</a></span> acceptent désormais un
   argument <code class="parameter">flags</code> additionnel, avec le support des
   drapeaux <strong><code><a href="pcre.constants.php#constant.preg-offset-capture">PREG_OFFSET_CAPTURE</a></code></strong> et
   <strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong>.
   Ceci influence le format du <a href="language.types.array.php" class="link">tableau</a> de matchs passé à la fonction de rappel.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.pdo">
  <h3 class="title">PDO</h3>

  <p class="para">
   Le nom d&#039;utilisateur et le mot de passe peuvent désormais être spécifiés en tant
   que partie du DSN PDO pour les pilotes mysql, mssql, sybase, dblib, firebird
   et oci. Précédemment, ceci était seulement supporté pour le pilote pgsql.
   Si un nom d&#039;utilisateur/mot de passe est défini à la fois dans le
   constructeur et le DSN, le constructeur prend précédence.
  </p>
  <p class="para">
   Il est désormais possible d&#039;échapper les points d&#039;interrogations dans les
   requêtes SQL pour éviter qu&#039;ils ne soient interprétés comme paramètre fictif.
   Écrire <code class="literal">??</code> permet d&#039;envoyer un seul point d&#039;interrogation
   à la base de données et, par exemple, utiliser l&#039;opérateur PostgreSQL JSON
   pour savoir si une clef existe (<code class="literal">?</code>).
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.pdo_oci">
  <h3 class="title">PDO_OCI</h3>

  <p class="para">
   <span class="methodname"><a href="pdostatement.getcolumnmeta.php" class="methodname">PDOStatement::getColumnMeta()</a></span> est désormais disponible.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.pdo_sqlite">
  <h3 class="title">PDO_SQLite</h3>

  <p class="para">
   <code class="literal">PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)</code>
   permet de vérifier si la déclaration est en lecture seule, c.-à-d. si elle
   ne modifie pas la base de données.
  </p>
  <p class="para">
   <code class="literal">PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)</code>
   active l&#039;utilisation des codes de résultats étendus dans
   <span class="function"><a href="pdo.errorinfo.php" class="function">PDO::errorInfo()</a></span> et
   <span class="function"><a href="pdostatement.errorinfo.php" class="function">PDOStatement::errorInfo()</a></span>.
  </p>
 </div>

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

  <p class="para">
   Ajout de <span class="methodname"><strong>SQLite3::lastExtendedErrorCode()</strong></span>
   pour récupérer le dernier code étendu du résultat.
  </p>
  <p class="para">
   Ajout de <code class="literal">SQLite3::enableExtendedResultCodes($enable = true)</code>,
   qui fera retourner des codes de résultats étendus par
   <span class="methodname"><a href="sqlite3.lasterrorcode.php" class="methodname">SQLite3::lastErrorCode()</a></span>.
  </p>
 </div>

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

  <div class="sect3" id="migration74.new-features.standard.strip-tags">
   <h4 class="title">strip_tags() avec un tableau de noms de tag</h4>
   <p class="para">
    <span class="function"><a href="function.strip-tags.php" class="function">strip_tags()</a></span> accepte désormais un <a href="language.types.array.php" class="link">tableau</a> de tags
    autorisés : au lieu de
    <code class="literal">strip_tags($str, &#039;&lt;a&gt;&lt;p&gt;&#039;)</code> il est désormais
    possible d&#039;écrire <code class="literal">strip_tags($str, [&#039;a&#039;, &#039;p&#039;])</code>.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.standard.magic-serialize">
   <h4 class="title">Sérialisation personnalisée d&#039;objets</h4>
   <p class="para">
    Un nouveau mécanisme de sérialisation personnalisée d&#039;objets a été ajouté,
    qui utilise deux nouvelles méthodes magiques :
    <code class="literal">__serialize</code> et <code class="literal">__unserialize</code>.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Retourne un tableau contenant tout l'état nécessaire de l'objet.<br /></span><span style="color: #007700">public function </span><span style="color: #0000BB">__serialize</span><span style="color: #007700">(): array<br />{<br />}<br /><br /></span><span style="color: #FF8000">// Restaure l'état d'un objet depuis le tableau de données fourni.<br /></span><span style="color: #007700">public function </span><span style="color: #0000BB">__unserialize</span><span style="color: #007700">(array </span><span style="color: #0000BB">$data</span><span style="color: #007700">): </span><span style="color: #0000BB">void<br /></span><span style="color: #007700">{<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    Le nouveau mécanisme de sérialisation succèdera à l&#039;interface
    <span class="interfacename"><a href="class.serializable.php" class="interfacename">Serializable</a></span>, qui sera rendue
    obsolète dans le futur.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.standard.array-merge-no-args">
   <h4 class="title">Les fonctions array merge sans arguments</h4>
   <p class="para">
    <span class="function"><a href="function.array-merge.php" class="function">array_merge()</a></span> et <span class="function"><a href="function.array-merge-recursive.php" class="function">array_merge_recursive()</a></span>
    peuvent désormais être appelées sans arguments, dans ce cas-là elles
    retourneront un <a href="language.types.array.php" class="link">tableau</a> vide. Ceci est utile en conjonction avec l&#039;opérateur
    de décomposition, par exemple <code class="literal">array_merge(...$arrays)</code>.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.standard.proc-open">
   <h4 class="title">La fonction <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span></h4>
   <p class="para">
    <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> accepte désormais un <a href="language.types.array.php" class="link">tableau</a> au lieu d&#039;une
    <a href="language.types.string.php" class="link">chaîne de caractères</a> pour la commande. Dans ce cas-là, le processus est ouvert directement
    (sans passer à travers un shell) et PHP s&#039;occupera d&#039;échapper les arguments
    lorsque nécessaire.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />proc_open</span><span style="color: #007700">([</span><span style="color: #DD0000">'php'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-r'</span><span style="color: #007700">, </span><span style="color: #DD0000">'echo "Hello World\n";'</span><span style="color: #007700">], </span><span style="color: #0000BB">$descriptors</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>

    </div>
   </p>
   <p class="para">
    <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> supporte désormais les descripteurs
    <code class="literal">redirect</code> et <code class="literal">null</code>.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Comme 2&gt;&amp;1 dans le shell<br /></span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$cmd</span><span style="color: #007700">, [</span><span style="color: #0000BB">1 </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'pipe'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">], </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'redirect'</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">]], </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Comme 2&gt;/dev/null ou 2&gt;nul dans le shell<br /></span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$cmd</span><span style="color: #007700">, [</span><span style="color: #0000BB">1 </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'pipe'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">], </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'null'</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>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.standard.sodium-argon-hash">
   <h4 class="title">argon2i(d) sans libargon</h4>
   <p class="para">
    <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> a désormais les implémentations de
    argon2i et argon2id de l&#039;extension sodium quand PHP est compilé sans libargon.
   </p>
  </div>

 </div>

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