<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration73.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'migration73.incompatible.php',
    1 => 'Modifications entra&icirc;nant une incompatibilit&eacute; ascendante',
    2 => 'Modifications entra&icirc;nant une incompatibilit&eacute; ascendante',
  ),
  'up' => 
  array (
    0 => 'migration73.php',
    1 => 'Migration de PHP 7.2.x vers PHP 7.3.x',
  ),
  'prev' => 
  array (
    0 => 'migration73.constants.php',
    1 => 'Nouvelles constantes globales',
  ),
  'next' => 
  array (
    0 => 'migration73.deprecated.php',
    1 => 'Fonctionnalit&eacute;s devenues obsol&egrave;tes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'appendices/migration73/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration73.incompatible" class="sect1">
 <h2 class="title">Modifications entraînant une incompatibilité ascendante</h2>

 <div class="sect2" id="migration73.incompatible.core">
  <h3 class="title">Cœur de PHP</h3>

  <div class="sect3" id="migration73.incompatible.core.heredoc-nowdoc">
   <h4 class="title">Interprétation des Labels de Terminaison Heredoc/Nowdoc</h4>

   <p class="para">
    Avec l&#039;introduction de <a href="migration73.new-features.php#migration73.new-features.core.heredoc" class="link">la syntaxe flexible heredoc
    / nowdoc</a>, les <a href="language.types.string.php" class="link">chaîne de caractères</a> doc qui contiennent le label de terminaison
    dans leur corps peuvent causer des erreurs de syntaxe ou changer en
    interprétation. Par exemple dans :
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$str </span><span style="color: #007700">= &lt;&lt;&lt;FOO<br /></span><span style="color: #DD0000">abcdefg<br /></span><span style="color: #007700">   FOO<br /></span><span style="color: #0000BB">FOO</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    l&#039;occurrence indentée de <code class="literal">FOO</code> n&#039;avait pas de signification
    particulière précédemment. Désormais elle sera interprétée comme la fin de
    la <a href="language.types.string.php" class="link">chaîne de caractères</a> heredoc et le <code class="literal">FOO;</code> suivant causera une erreur
    de syntaxe. Ce problème peut toujours être résolu en choisissant un label de
    terminaison qui n&#039;apparait pas dans le contenu de la <a href="language.types.string.php" class="link">chaîne de caractères</a>.
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.continue-targeting-switch">
   <h4 class="title">Continue visant Switch génèrent des Avertissements</h4>

   <p class="para">
    Les déclarations <code class="literal">continue</code> visant les structures de flux de
    contrôle <code class="literal">switch</code> généreront désormais un avertissement.
    En PHP ces déclarations <code class="literal">continue</code> sont équivalentes à
    <code class="literal">break</code>, alors qu&#039;elles se comportent comme 
    <code class="literal">continue 2</code> dans d&#039;autres langages.
    <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">while (</span><span style="color: #0000BB">$foo</span><span style="color: #007700">) {<br />    switch (</span><span style="color: #0000BB">$bar</span><span style="color: #007700">) {<br />      case </span><span style="color: #DD0000">"baz"</span><span style="color: #007700">:<br />         continue;<br />         </span><span style="color: #FF8000">// Warning: "continue" targeting switch is equivalent to<br />         //          "break". Did you mean to use "continue 2"?<br />   </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="migration73.incompatible.core.arrayaccess">
   <h4 class="title">Interprétation Stricte des Clés de Chaînes de Caractères Entiers sur ArrayAccess</h4>

   <p class="para">
    Les accès de <a href="language.types.array.php" class="link">tableau</a> du type <code class="literal">$obj[&quot;123&quot;]</code>, où
    <code class="literal">$obj</code> implémente <span class="classname"><a href="class.arrayaccess.php" class="classname">ArrayAccess</a></span> et
    <code class="literal">&quot;123&quot;</code> est une <a href="language.types.string.php" class="link">chaîne de caractères</a> d&#039;<a href="language.types.integer.php" class="link">entier</a> littérale ne
    résulteront plus en une conversion implicite en <a href="language.types.integer.php" class="link">entier</a>, c.-à-d.,
    <code class="literal">$obj-&gt;offsetGet(&quot;123&quot;)</code> sera appelé au lieu de
    <code class="literal">$obj-&gt;offsetGet(123)</code>. Ceci correspond au comportement
    pour les non littéraux. Le comportement des <a href="language.types.array.php" class="link">tableau</a> n&#039;est pas affecté
    d&#039;une quelconque manière, ils continuent de convertir implicitement
    des clés de <a href="language.types.string.php" class="link">chaîne de caractères</a> en <a href="language.types.integer.php" class="link">entier</a>.
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.static-properties">
   <h4 class="title">Les Propriétés Statiques ne sont plus séparées par l&#039;Affectation de Référence</h4>

   <p class="para">
    En PHP, les propriétés statiques sont partagées entre les classes héritantes,
    sauf si la propriété statique est explicitement remplacée dans une classe enfant.
    Cependant à cause d&#039;un artefact d&#039;implémentation il était possible de séparer
    les propriétés statiques en affectant une référence.
    Cette lacune a été corrigée.
    <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">Test </span><span style="color: #007700">{<br />    public static </span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />}<br />class </span><span style="color: #0000BB">Test2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Test </span><span style="color: #007700">{ }<br /><br /></span><span style="color: #0000BB">Test2</span><span style="color: #007700">::</span><span style="color: #0000BB">$x </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$x</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Test</span><span style="color: #007700">::</span><span style="color: #0000BB">$x</span><span style="color: #007700">, </span><span style="color: #0000BB">Test2</span><span style="color: #007700">::</span><span style="color: #0000BB">$x</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Avant : int(0), int(1)<br />// Maintenant : int(1), int(1)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

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

  <div class="sect3" id="migration73.incompatible.core.reference-unwrapping">
   <h4 class="title">
    Les références retournées par les tableaux et les accès aux propriétés
    sont immédiatement décompressées
   </h4>

   <p class="para">
    Les références retournées par les tableaux et les accès aux propriétés
    sont désormais décompressées dans le cadre de l&#039;accès. Ceci signifie qu&#039;il
    n&#039;est plus possible de modifier la référence entre l&#039;accès et l&#039;utilisation
    de la valeur accédée :
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$arr </span><span style="color: #007700">= [</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$ref </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">] + (</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">] = </span><span style="color: #0000BB">2</span><span style="color: #007700">));<br /></span><span style="color: #FF8000">// Avant : int(4), Maintenant : int(3)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    Ceci rend le comportement des références et non références cohérent.
    Il est à noter que lire et écrire une valeur à l&#039;intérieur d&#039;une unique
    expression continue d&#039;être un comportement non défini et peut changer
    de nouveau dans le futur.
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.traversable-unpacking">
   <h4 class="title">La décompression d&#039;arguments de Traversables avec des clés non-entières n&#039;est plus prise en charge</h4>

   <p class="para">
    La décompression d&#039;arguments a cessé de fonctionner avec
    <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span>s avec des clés non-entières
    Le code suivant fonctionnait en PHP 5.6-7.2 par accident.
    <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">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(...</span><span style="color: #0000BB">$args</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">);<br />}<br />function </span><span style="color: #0000BB">gen</span><span style="color: #007700">() {<br />    yield </span><span style="color: #0000BB">1.23 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">123</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(...</span><span style="color: #0000BB">gen</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

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

  <div class="sect3" id="migration73.incompatible.core.misc">
   <h4 class="title">Divers</h4>

   <p class="para">
    L&#039;utilitaire <var class="filename">ext_skel</var> a été entièrement repensé avec
    de nouvelles options et certaines anciennes options supprimées.
    Ceci est maintenant écrit en PHP et n&#039;a aucune dépendance externe.
   </p>

   <p class="para">
    Le support pour BeOS a été abandonné.
   </p>

   <p class="para">
    Les exceptions lancées à cause d&#039;une conversion automatique d&#039;avertissements
    en exceptions avec le mode <code class="literal">EH_THROW</code> (par exemple certaines
    exceptions de <span class="classname"><a href="class.datetime.php" class="classname">DateTime</a></span>) ne remplissent plus l&#039;état de
    <span class="function"><a href="function.error-get-last.php" class="function">error_get_last()</a></span>. En tant que telles, elles fonctionnent
    désormais de la même manière que les exceptions levées manuellement.
   </p>

   <p class="para">
    <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> rapporte désormais les mauvais types en
    tant que <code class="literal">int</code> et <code class="literal">bool</code> au lieu de
    <code class="literal">integer</code> et <code class="literal">boolean</code>, respectivement.
   </p>

   <p class="para">
    Les variables indéfinies passées à <span class="function"><a href="function.compact.php" class="function">compact()</a></span> seront
    désormais rapportées avec une notice.
   </p>

   <p class="para">
    <span class="function"><a href="function.getimagesize.php" class="function">getimagesize()</a></span> et les fonctions connexes rapportent
    désormais le type MIME des images BMP en tant que
    <code class="literal">image/bmp</code> au lieu de <code class="literal">image/x-ms-bmp</code>,
    car le premier a été inscrit avec l&#039;IANA (voir
    <a href="https://datatracker.ietf.org/doc/html/rfc7903" class="link external">&raquo;&nbsp;RFC 7903</a>).
   </p>

   <p class="para">
    <span class="function"><a href="function.stream-socket-get-name.php" class="function">stream_socket_get_name()</a></span> retourne désormais les adresses
    IPv6 avec des crochets. Par exemple <code class="literal">&quot;[::1]:1337&quot;</code> sera
    retourné au lieu de <code class="literal">&quot;::1:1337&quot;</code>.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration73.incompatible.bc">
  <h3 class="title">BCMath Mathématiques à précision arbitraire</h3>

  <p class="para">
   Tous les avertissements lancés par les <a href="ref.bc.php" class="link">fonctions BCMath</a>
   utilisent désormais le gestionnaire d&#039;erreur de PHP. Auparavant certains
   avertissements étaient écrits directement à stderr.
  </p>

  <p class="para">
   <span class="function"><a href="function.bcmul.php" class="function">bcmul()</a></span> et <span class="function"><a href="function.bcpow.php" class="function">bcpow()</a></span> retournent désormais
   les nombres avec la précision demandée. Auparavant, certains nombres pouvaient
   omettre les zéros de fin décimaux.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.imap">
  <h3 class="title">IMAP, POP3 et NNTP</h3>

  <p class="para">
   Les authentifications <strong class="command">rsh</strong>/<strong class="command">ssh</strong> sont
   désactivées par défaut. Il convient d&#039;utiliser <a href="imap.configuration.php#ini.imap.enable-insecure-rsh" class="link">imap.enable_insecure_rsh</a> pour
   les activer. Il est à noter que la bibliothèque IMAP ne filtre
   pas les noms des boîtes aux lettres avant de les passer aux commandes
   <strong class="command">rsh</strong>/<strong class="command">ssh</strong>, ainsi passer des données non
   fiables à cette fonction avec <strong class="command">rsh</strong>/<strong class="command">ssh</strong>
   activé est dangereux.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.mbstring">
  <h3 class="title">Chaînes de caractères multioctets</h3>

  <p class="para">
   En raison de la prise en charge des captures nommées, les masques
   <code class="literal">mb_ereg_*()</code> utilisant les captures nommées se comporteront
   différemment. En particulier les captures nommées feront partie des
   correspondances et <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> interprétera la
   syntaxe additionnelle. Voir <a href="migration73.new-features.php#migration73.new-features.mbstring.named-captures" class="link">Captures
    Nommées</a> pour plus d&#039;information.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.mysqli">
  <h3 class="title">Extension MySQL Améliorée (MySQLi)</h3>

  <p class="para">
   Les déclarations préparées rapportent désormais les fractions de secondes
   pour les colonnes <code class="literal">DATETIME</code>, <code class="literal">TIME</code> et
   <code class="literal">TIMESTAMP</code> avec spécificateur décimal (par exemple
   <code class="literal">TIMESTAMP(6)</code> lors de l&#039;utilisation de microsecondes).
   Auparavant les fractions de secondes étaient tout simplement omises
   des valeurs de retours.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.pdo-mysql">
  <h3 class="title">Fonctions MySQL (PDO_MYSQL)</h3>

  <p class="para">
   Les déclarations préparées rapportent désormais les fractions de secondes
   pour les colonnes <code class="literal">DATETIME</code>, <code class="literal">TIME</code> et
   <code class="literal">TIMESTAMP</code> avec spécificateur décimal (par exemple
   <code class="literal">TIMESTAMP(6)</code> lors de l&#039;utilisation de microsecondes).
   Auparavant les fractions de secondes étaient tout simplement omises
   des valeurs de retours. Il est à noter que ceci affecte uniquement
   l&#039;utilisation de <a href="ref.pdo-mysql.php" class="link">PDO_MYSQL</a> avec les
   déclarations préparées émulées désactivées (par exemple en utilisant la
   fonctionnalité native de préparation). Les déclarations utilisant des
   connexions qui ont <strong><code><a href="pdo.constants.php#pdo.constants.attr-emulate-prepares">PDO::ATTR_EMULATE_PREPARES</a></code></strong>=<strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>
   (ce qui est par défaut) ne sont pas affectées par la correction de bogue
   et récupéraient déjà les valeurs des fractions de secondes depuis le moteur.
  </p>
 </div>

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

  <p class="para">
   Les exportations de <a href="book.reflection.php" class="link">Reflection</a> en
   <a href="language.types.string.php" class="link">chaîne de caractères</a> utilisent désormais
   <code class="literal">int</code> et <code class="literal">bool</code> au lieu de
   <code class="literal">integer</code> et <code class="literal">boolean</code>, respectivement.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.spl">
  <h3 class="title">Bibliothèque Standard de PHP (SPL)</h3>

  <p class="para">
   Si un autochargeur <a href="book.spl.php" class="link">SPL</a> lance une exception,
   les autochargeurs suivants ne seront pas exécutés. Précédemment tous les
   autochargeurs étaient exécutés et les exceptions étaient chaînées.
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.simplexml">
  <h3 class="title">SimpleXML</h3>

  <p class="para">
   Les opérations mathématiques impliquant les objets <a href="book.simplexml.php" class="link">SimpleXML</a> traiteront désormais le texte
   comme un <a href="language.types.integer.php" class="link">entier</a> ou un <a href="language.types.float.php" class="link">nombre décimal</a>, selon ce qui est plus approprié.
   Auparavant les valeurs étaient traitées comme un <a href="language.types.integer.php" class="link">entier</a> sans condition.
  </p>
 </div>

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

  <p class="para">
   À partir de PHP 7.3.23, les <em>noms</em> des cookies entrants
   ne sont plus url-décodés pour des raisons de sécurité.
  </p>
 </div>

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