<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration84.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'migration84.incompatible.php',
    1 => 'Changements non r&eacute;trocompatibles',
    2 => 'Changements non r&eacute;trocompatibles',
  ),
  'up' => 
  array (
    0 => 'migration84.php',
    1 => 'Migration de PHP 8.3.x vers PHP 8.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration84.constants.php',
    1 => 'Nouvelles constantes globales',
  ),
  'next' => 
  array (
    0 => 'migration84.deprecated.php',
    1 => 'Fonctionnalit&eacute;s d&eacute;pr&eacute;ci&eacute;es',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'appendices/migration84/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration84.incompatible" class="sect1">
 <h2 class="title">Changements non rétrocompatibles</h2>

 <p class="simpara">
  Sauf mention contraire dans cette section,
  chaque nouvelle <a href="migration84.new-functions.php" class="link">fonction</a>,
  <a href="migration84.new-classes.php" class="link">classe, interface, énumération</a>,
  ou <a href="migration84.constants.php" class="link">constante</a>
  peut entraîner le lancement d&#039;une exception de redéclaration <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span>.
 </p>

 <div class="sect2" id="migration84.incompatible.core">
  <h3 class="title">PHP Core</h3>

  
  <div class="sect3" id="migration84.incompatible.core.exit">
   <h4 class="title">Changement du comportement de <span class="function"><a href="function.exit.php" class="function">exit()</a></span></h4>

   <p class="simpara">
    Les constructions de langage <span class="function"><a href="function.exit.php" class="function">exit()</a></span> (et <span class="function"><a href="function.die.php" class="function">die()</a></span>)
    se comportent désormais davantage comme une fonction.
    Cela signifie qu&#039;elles peuvent maintenant être passées comme des <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>s,
    
    sont affectées par l&#039;instruction <code class="literal">strict_types</code>,
    et effectuent désormais les coercitions de type habituelles au lieu de caster
    toute valeur non entière en chaîne.
   </p>

   <p class="simpara">
    En conséquence, passer des types invalides à <span class="function"><a href="function.exit.php" class="function">exit()</a></span> et
    <span class="function"><a href="function.die.php" class="function">die()</a></span> entraîne désormais systématiquement le lancement d&#039;une
    exception <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.recursion-comparison">
   <h4 class="title">Récursion lors de la comparaison</h4>

   <p class="simpara">
    Rencontrer une récursion lors de la comparaison entraîne désormais une
    exception <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span> au lieu d&#039;une erreur fatale
    <strong><code><a href="errorfunc.constants.php#constant.e-error">E_ERROR</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.readonly-indirect-modification">
   <h4 class="title">Modification indirecte de propriétés en lecture seule</h4>

   
   <p class="simpara">
    La modification indirecte de propriétés en lecture seule dans <code class="code">__clone()</code>
    n&#039;est plus autorisée, par exemple <code class="code">$ref = &amp;$this-&gt;readonly</code>.
    C&#039;était déjà interdit pour l&#039;initialisation en lecture seule, et c&#039;était un
    oubli dans l&#039;implémentation de la &quot;réinitialisation en lecture seule lors du clonage&quot;.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.constant-type-change">
   <h4 class="title">Changement de type des constantes</h4>

   <p class="simpara">
    Les constantes <strong><code><a href="reserved.constants.php#constant.php-debug">PHP_DEBUG</a></code></strong> et <strong><code><a href="reserved.constants.php#constant.php-zts">PHP_ZTS</a></code></strong>
    sont désormais de type <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
    Auparavant, elles étaient de type <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.tempnam-length">
   <h4 class="title">Longueur du nom de fichier temporaire</h4>

   <p class="simpara">
    Le nom des fichiers téléversés et des fichiers créés par la fonction
    <span class="function"><a href="function.tempnam.php" class="function">tempnam()</a></span> est désormais plus long de 13 octets.
    La longueur totale dépend toujours de la plateforme.
   </p>
  </div>

  
  <div class="sect3" id="migration84.incompatible.core.e-strict">
   <h4 class="title">Suppression du niveau d&#039;erreur <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong></h4>

   <p class="simpara">
    Le niveau d&#039;erreur <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> a été supprimé,
    car il n&#039;était plus utilisé dans le moteur PHP.
    La constante <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> a également été dépréciée.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.typed-constants">
  <h3 class="title">Constantes de classe d&#039;extension désormais typées</h3>

  <p class="para">
   Les constantes de classe suivantes déclarent désormais un type sur leurs
   constantes :
   <ul class="simplelist">
    <li><a href="book.datetime.php" class="link">Date</a></li>
    <li><a href="book.intl.php" class="link">Intl</a></li>
    <li><a href="book.pdo.php" class="link">PDO</a></li>
    <li><a href="book.reflection.php" class="link">Reflection</a></li>
    <li><a href="book.spl.php" class="link">SPL</a></li>
    <li><a href="book.sqlite3.php" class="link">Sqlite</a></li>
    <li><a href="book.xmlreader.php" class="link">XMLReader</a></li>
   </ul>
  </p>
 </div>

 
 <div class="sect2" id="migration84.incompatible.resource2object">
  <h3 class="title">Migration des ressources vers des objets</h3>

  <p class="simpara">
   Plusieurs <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s ont été migrés vers des <a href="language.types.object.php" class="link">objet</a>s.
   La vérification de la valeur de retour à l&#039;aide de <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span>
   doit être remplacée par des vérifications de <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, sauf indication contraire.
  </p>

  <div class="sect3" id="migration84.incompatible.resource2object.dba">
   <h4 class="title">DBA</h4>

   <p class="simpara">
    Les fonctions <a href="book.dba.php" class="link">DBA</a> acceptent et retournent désormais
    <span class="classname"><a href="class.dba-connection.php" class="classname">Dba\Connection</a></span> à la place de
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">dba_connection</code>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.resource2object.odbc">
   <h4 class="title">ODBC</h4>

   <p class="simpara">
    Les fonctions <a href="book.uodbc.php" class="link">ODBC</a> acceptent et retournent désormais
    <span class="classname"><strong class="classname">Odbc\Result</strong></span> à la place de
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">odbc_result</code>.
   </p>

   <p class="simpara">
    Les fonctions <a href="book.uodbc.php" class="link">ODBC</a> acceptent et retournent désormais
    <span class="classname"><strong class="classname">Odbc\Connection</strong></span> à la place de
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">odbc_connection</code>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.resource2object.soap">
   <h4 class="title">SOAP</h4>

   <p class="simpara">
    La propriété <span class="property"><a href="class.soapclient.php#soapclient.props.httpurl">SoapClient::$httpurl</a></span> est désormais un objet
    <span class="classname"><strong class="classname">Soap\Url</strong></span> plutôt qu&#039;une
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="literal">soap_url</code>.
    Les vérifications à l&#039;aide de <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (par exemple
    <code class="code">is_resource($client-&gt;httpurl)</code>) doivent être remplacées par des
    vérifications de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (par exemple <code class="code">$client-&gt;httpurl !== null</code>).
   </p>
   <p class="simpara">
    La propriété <span class="property"><a href="class.soapclient.php#soapclient.props.sdl">SoapClient::$sdl</a></span> est désormais un objet
    <span class="classname"><strong class="classname">Soap\Sdl</strong></span> plutôt qu&#039;une
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="literal">soap_sdl</code>.
    Les vérifications à l&#039;aide de <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (par exemple
    <code class="code">is_resource($client-&gt;sdl)</code>) doivent être remplacées par des
    vérifications de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (par exemple <code class="code">$client-&gt;sdl !== null</code>).
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.new-warnings-exceptions">
  <h3 class="title">Nouvelles alertes et exceptions</h3>

  <p class="simpara">
   De nouvelles alertes et exceptions ont été ajoutées pour signaler des erreurs
   de programmation, c&#039;est-à-dire des valeurs invalides fournies en argument.
  </p>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.curl">
   <h4 class="title">Curl</h4>

   <p class="simpara">
    <span class="function"><a href="function.curl-multi-select.php" class="function">curl_multi_select()</a></span> lance désormais une 
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si le paramètre
    <code class="parameter">timeout</code> est inférieur à
    <code class="literal">0</code> ou supérieur à <strong><code><a href="reserved.constants.php#constant.php-int-max">PHP_INT_MAX</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.gd">
   <h4 class="title">Gd</h4>

   <p class="para">
    <span class="simplelist"><span class="function"><a href="function.imagejpeg.php" class="function">imagejpeg()</a></span>, <span class="function"><a href="function.imagewebp.php" class="function">imagewebp()</a></span>, <span class="function"><a href="function.imagepng.php" class="function">imagepng()</a></span>, <span class="function"><a href="function.imageavif.php" class="function">imageavif()</a></span></span>
    lancent désormais une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si un
    <code class="parameter">quality</code> invalide est passé.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imageavif.php" class="function">imageavif()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si un paramètre
    <code class="parameter">speed</code> invalide est passé.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagescale.php" class="function">imagescale()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si les paramètres
    <code class="parameter">width</code> ou <code class="parameter">height</code>    
    sont en dehors des limites.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagescale.php" class="function">imagescale()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si une valeur de
    <code class="parameter">mode</code> invalide est passée.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagefilter.php" class="function">imagefilter()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> avec le filtre
    <strong><code><a href="image.constants.php#constant.img-filter-scatter">IMG_FILTER_SCATTER</a></code></strong> si les paramètres
    <code class="parameter">sub</code> ou <code class="parameter">plus</code>
    sont en dehors des limites.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.gettext">
   <h4 class="title">Gettext</h4>

   <p class="para">
    <span class="simplelist"><span class="function"><a href="function.bind-textdomain-codeset.php" class="function">bind_textdomain_codeset()</a></span>, <span class="function"><a href="function.textdomain.php" class="function">textdomain()</a></span>, <span class="function">d<span class="replaceable">*</span>gettext</span></span>
    lancent désormais une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si le
    <code class="parameter">domain</code> est la chaîne vide.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.intl">
   <h4 class="title">Intl</h4>

   <p class="para">
    <span class="function"><a href="resourcebundle.get.php" class="function">resourcebundle_get()</a></span>,
    <span class="function"><a href="resourcebundle.get.php" class="function">ResourceBundle::get()</a></span>, et l&#039;accès aux indices sur un
    <span class="classname"><a href="class.resourcebundle.php" class="classname">ResourceBundle</a></span> lancent désormais :
    <ul class="simplelist">
     <li>
      <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> pour les types d'offset invalides
     </li>
     <li>
      <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> pour une <a href="language.types.string.php" class="link">chaîne de caractères</a> vide
     </li>
     <li>
      <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si l'index entier ne rentre pas
      dans un entier signé 32 bits
     </li>
    </ul>
   </p>

   <p class="simpara">
    <span class="methodname"><a href="intldateformatter.create.php" class="methodname">IntlDateFormatter::__construct()</a></span> lance une 
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si le 
    <code class="parameter">locale</code> est invalide.
   </p>

   <p class="simpara">
    <span class="methodname"><a href="numberformatter.create.php" class="methodname">NumberFormatter::__construct()</a></span> lance une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si le
    <code class="parameter">locale</code> est invalide.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.mbstring">
   <h4 class="title">MBString</h4>

   <p class="simpara">
    <span class="function"><a href="function.mb-encode-numericentity.php" class="function">mb_encode_numericentity()</a></span> et
    <span class="function"><a href="function.mb-decode-numericentity.php" class="function">mb_decode_numericentity()</a></span> vérifient désormais que
    <code class="parameter">map</code> est uniquement composé de <a href="language.types.integer.php" class="link">entier</a>s,
    si ce n&#039;est pas le cas, une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> est lancée.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.mb-http-input.php" class="function">mb_http_input()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si le <code class="parameter">type</code>
    est invalide.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.mb-http-output.php" class="function">mb_http_output()</a></span> vérifie désormais que
    <code class="parameter">encoding</code> ne contient pas de caractères nuls,
    si c&#039;est le cas, une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> est lancée.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.odbc">
   <h4 class="title">ODBC</h4>

   <p class="simpara">
    <span class="function"><a href="function.odbc-fetch-row.php" class="function">odbc_fetch_row()</a></span> retourne <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> lorsque
    <code class="parameter">row</code> est inférieur ou égal à <code class="literal">0</code>.
    Une alerte est désormais émise dans ce cas.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.pcntl">
   <h4 class="title">PCNTL</h4>

   <p class="para">
    Les fonctions <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span>,
    <span class="function"><a href="function.pcntl-sigwaitinfo.php" class="function">pcntl_sigwaitinfo()</a></span>, et
    <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> lancent désormais :
    <ul class="simplelist">
     <li>
      Une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si le tableau
      <code class="parameter">signals</code> est vide
      (sauf pour <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span> si le
      <code class="parameter">mode</code> est <strong><code><a href="pcntl.constants.php#constant.sig-setmask">SIG_SETMASK</a></code></strong>)
     </li>
     <li>
      Une <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> si une valeur du tableau
      <code class="parameter">signals</code> n'est pas un <a href="language.types.integer.php" class="link">entier</a>
     </li>
     <li>
      Une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si la valeur du
      <code class="parameter">signals</code> n'est pas un numéro de signal valide
     </li>
    </ul>
   </p>

   <p class="simpara">
    La fonction <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si le
    <code class="parameter">mode</code> n&#039;est pas l&#039;une des <strong><code><a href="pcntl.constants.php#constant.sig-block">SIG_BLOCK</a></code></strong>,
    <strong><code><a href="pcntl.constants.php#constant.sig-unblock">SIG_UNBLOCK</a></code></strong>, ou <strong><code><a href="pcntl.constants.php#constant.sig-setmask">SIG_SETMASK</a></code></strong>.
   </p>

   <p class="para">
    La fonction <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> lance désormais :
    <ul class="simplelist">
     <li>
      Une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si
      <code class="parameter">seconds</code> est inférieur à <code class="literal">0</code>
     </li>
     <li>
      Une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si
      <code class="parameter">nanoseconds</code> est inférieur à <code class="literal">0</code>
      ou supérieur à <code class="literal">1e9</code>
     </li>
     <li>
      Une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si les deux
      <code class="parameter">seconds</code> et <code class="parameter">nanoseconds</code>
      sont <code class="literal">0</code>
     </li>
    </ul>
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.session">
   <h4 class="title">Session</h4>

   <p class="simpara">
    Définir une valeur non positive pour <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a>
    ou une valeur négative pour <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
    émet désormais une alerte.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.simplexml">
   <h4 class="title">SimpleXML</h4>

   <p class="simpara">
    Appeler <span class="function"><a href="function.simplexml-import-dom.php" class="function">simplexml_import_dom()</a></span> avec un objet non-XML
    lance désormais une <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> au lieu d&#039;une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.standard">
   <h4 class="title">Standard</h4>

   <p class="simpara">
    La fonction <span class="function"><a href="function.round.php" class="function">round()</a></span> vérifie désormais la valeur du
    <code class="parameter">mode</code> et lance une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> pour les modes invalides.
    Auparavant, les modes invalides auraient été interprétés comme
    <strong><code><a href="math.constants.php#constant.php-round-half-up">PHP_ROUND_HALF_UP</a></code></strong>.
   </p>

   <p class="simpara">
    La fonction <span class="function"><a href="function.str-getcsv.php" class="function">str_getcsv()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si les arguments
    <code class="parameter">separator</code> et <code class="parameter">enclosure</code>
    ne font pas un octet de long, ou si l&#039;argument <code class="parameter">escape</code>
    n&#039;est pas un octet de long ou une chaîne vide.
    Cela aligne le comportement pour être identique à celui de
    <span class="function"><a href="function.fputcsv.php" class="function">fputcsv()</a></span> et <span class="function"><a href="function.fgetcsv.php" class="function">fgetcsv()</a></span>.
   </p>

   <p class="simpara">
    La fonction <span class="function"><a href="function.php-uname.php" class="function">php_uname()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si le
    <code class="parameter">mode</code> est invalide.
   </p>

   <p class="simpara">
    L&#039;option <code class="literal">&quot;allowed_classes&quot;</code> pour
    <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> lance désormais des
    <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> et
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si ce n&#039;est pas un
    <span class="type"><a href="language.types.array.php" class="type array">array</a></span> de noms de classe.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.xmlreader">
   <h4 class="title">XMLReader</h4>

   <p class="simpara">
    Passer un encodage de caractères invalide à
    <span class="methodname"><a href="xmlreader.open.php" class="methodname">XMLReader::open()</a></span> ou
    <span class="methodname"><a href="xmlreader.xml.php" class="methodname">XMLReader::XML()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>

   <p class="simpara">
    Passer une <a href="language.types.string.php" class="link">chaîne de caractères</a> contenant des octets nuls émettait précédemment une alerte
    et lance désormais une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.xmlwriter">
   <h4 class="title">XMLWriter</h4>

   <p class="simpara">
    Passer une <a href="language.types.string.php" class="link">chaîne de caractères</a> contenant des octets nuls émettait précédemment une alerte
    et lance désormais une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.xsl">
   <h4 class="title">XSL</h4>

   <p class="simpara">
    <span class="methodname"><a href="xsltprocessor.setparameter.php" class="methodname">XSLTProcessor::setParameter()</a></span> lance désormais une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> lorsque ses arguments contiennent
    des octets nuls. Cela n&#039;a jamais fonctionné correctement en premier lieu,
    c&#039;est pourquoi une exception est maintenant lancée.
   </p>

   <p class="simpara">
    Appeler <span class="methodname"><a href="xsltprocessor.importstylesheet.php" class="methodname">XSLTProcessor::importStyleSheet()</a></span> avec un
    objet non-XML lance désormais une <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span>
    au lieu d&#039;une <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>

   
   <p class="simpara">
    L&#039;échec d&#039;appeler une fonction de rappel PHP pendant l&#039;évaluation lance
    au lieu d&#039;émettre une alerte.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.date">
  <h3 class="title">Date</h3>

  <p class="para">
   Le symbole <code class="literal">number</code> dans les <a href="datetime.formats.php#datetime.formats.relative" class="link">formats relatifs</a>
   accepte à nouveau plusieurs signes, par exemple <code class="literal">+-2</code>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.dom">
  <h3 class="title">DOM</h3>

  <p class="simpara">
   Quelques méthodes DOM retournaient précédemment <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> ou une
   <span class="exceptionname"><a href="class.domexception.php" class="exceptionname">DOMException</a></span> <strong><code><a href="dom.constants.php#constant.dom-php-err">DOM_PHP_ERR</a></code></strong>
   si un nouveau nœud ne pouvait pas être alloué.
   Elles lancent désormais systématiquement une <span class="exceptionname"><a href="class.domexception.php" class="exceptionname">DOMException</a></span>
   <strong><code><a href="dom.constants.php#constant.dom-invalid-state-err">DOM_INVALID_STATE_ERR</a></code></strong>.
   Cette situation est extrêmement improbable et la probabilité d&#039;être affecté
   est faible.
   En conséquence, <span class="methodname"><a href="domimplementation.createdocument.php" class="methodname">DOMImplementation::createDocument()</a></span>
   a désormais un type de retour provisoire de <span class="classname"><a href="class.domdocument.php" class="classname">DOMDocument</a></span>
   
   à la place de <code class="code">DOMDocument|false</code>.
  </p>

  <p class="simpara">
   Auparavant, les objets <span class="classname"><a href="class.domxpath.php" class="classname">DOMXPath</a></span> pouvaient être clonés,
   mais cela résultait en un objet inutilisable.
   Cela n&#039;est plus possible, et cloner un objet <span class="classname"><a href="class.domxpath.php" class="classname">DOMXPath</a></span>
   lance désormais une <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span>.
  </p>

  
  <p class="simpara">
   La méthode <span class="methodname"><strong>DOMImplementation::getFeature()</strong></span> a été supprimée.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.gmp">
  <h3 class="title">GMP</h3>

  
  <p class="simpara">
   La classe <span class="classname"><a href="class.gmp.php" class="classname">GMP</a></span> est désormais finale et ne peut plus
   être étendue.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.mbstring">
  <h3 class="title">MBString</h3>

  <p class="simpara">
   En cas de chaînes invalides (celles avec des erreurs d&#039;encodage),
   <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span> interprète désormais les indices de caractères
   de la même manière que la plupart des autres fonctions mbstring.
   Cela signifie que les indices de caractères retournés par <span class="function"><a href="function.mb-strpos.php" class="function">mb_strpos()</a></span>
   peuvent être passés à <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span>.
  </p>

  <p class="simpara">
   Pour les chaînes SJIS-Mac (MacJapanese), les indices de caractères passés à
   <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span> font désormais référence aux indices des
   points de code Unicode qui sont produits lorsque la chaîne est convertie en Unicode.
   C&#039;est significatif car environ 40 caractères SJIS-Mac se convertissent en une
   séquence de plusieurs points de code Unicode.
  </p>
 </div>

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

  <p class="simpara">
   La constante non utilisée et non documentée
   <strong><code>MYSQLI_SET_CHARSET_DIR</code></strong> a été supprimée.
  </p>

  <p class="simpara">
   La constante <strong><code><a href="mysqli.constants.php#constant.mysqli-stmt-attr-prefetch-rows">MYSQLI_STMT_ATTR_PREFETCH_ROWS</a></code></strong> a été
   supprimée. Cette fonctionnalité n&#039;est pas disponible avec mysqlnd.
  </p>

  <p class="simpara">
   Les constantes <strong><code><a href="mysqli.constants.php#constant.mysqli-cursor-type-for-update">MYSQLI_CURSOR_TYPE_FOR_UPDATE</a></code></strong> et
   <strong><code><a href="mysqli.constants.php#constant.mysqli-cursor-type-scrollable">MYSQLI_CURSOR_TYPE_SCROLLABLE</a></code></strong> ont été supprimées.
   Ces fonctionnalités n&#039;ont jamais été implémentées,
   ni avec mysqlnd ni avec libmysql.
  </p>

  <p class="simpara">
   La constante non utilisée <strong><code><a href="mysqli.constants.php#constant.mysqli-type-interval">MYSQLI_TYPE_INTERVAL</a></code></strong>, qui est
   actuellement un stub et un alias pour <strong><code><a href="mysqli.constants.php#constant.mysqli-type-enum">MYSQLI_TYPE_ENUM</a></code></strong>,
   a été supprimée.
   
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.mysqlnd">
  <h3 class="title">MySQLnd</h3>

  <p class="simpara">
   Le code d&#039;erreur signalé pour les délais d&#039;attente du serveur MySQL a été changé de
   <code class="literal">2006</code> à <code class="literal">4031</code> pour les versions du serveur
   Mysql 8.0.24 et supérieures.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.opcache">
  <h3 class="title">Opcache</h3>

  <p class="simpara">
   La valeur maximale de la configuration
   <a href="opcache.configuration.php#ini.opcache.interned-strings-buffer" class="link">opcache.interned_strings_buffer</a>
   sur les architectures 64 bits est désormais <code class="literal">32767</code>.
   Auparavant, elle était de <code class="literal">4095</code>.
  </p>

  <div class="sect3">
   <h4 class="title">JIT</h4>

   <p class="simpara">
    La valeur par défaut de la configuration JIT a changé de
    <a href="opcache.configuration.php#ini.opcache.jit" class="link"><code class="literal">opcache.jit=tracing</code></a>
    et <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link"><code class="literal">opcache.jit_buffer_size=0</code></a>
    pour <a href="opcache.configuration.php#ini.opcache.jit" class="link"><code class="literal">opcache.jit=disable</code></a>
    et <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link"><code class="literal">opcache.jit_buffer_size=64M</code></a>, respectivement.
   </p>

   <p class="simpara">
    Cela n&#039;affecte pas le comportement observable par défaut,
    car le JIT est toujours désactivé par défaut.
    Cependant, il est désormais désactivé via la configuration
    <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a>,
    plutôt que
    <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link">opcache.jit_buffer_size</a>.
    Cela peut affecter les utilisateurs qui ont précédemment activé le JIT via
    <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link">opcache.jit_buffer_size</a>
    exclusivement, sans spécifier également un mode JIT en utilisant
    <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a>.
    Pour activer la compilation JIT, définissez la valeur de configuration
    <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a> en conséquence.
   </p>

   <p class="simpara">
    Si la compilation <abbr>JIT</abbr> est activée, <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> quittera désormais avec une erreur fatale
    au démarrage si l&#039;initialisation du compilateur <abbr>JIT</abbr> a échoué pour une raison quelconque.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.pcntl">
  <h3 class="title">PCNTL</h3>

  <p class="simpara">
   Les fonctions <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span>,
   <span class="function"><a href="function.pcntl-sigwaitinfo.php" class="function">pcntl_sigwaitinfo()</a></span>, et
   <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> retournent désormais systématiquement
   <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en cas d&#039;échec.
   Dans certains cas précédemment, elles pouvaient retourner la valeur <code class="literal">-1</code>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pcre">
  <h3 class="title">PCRE</h3>

  <p class="simpara">
   La version de pcre2lib incluse a été mise à jour en version 10.44.
   Par conséquent, cela signifie que <code class="literal">{,3}</code> est désormais reconnu
   comme un quantificateur au lieu d&#039;un texte.
   De plus, la signification de certaines classes de caractères en mode UCP a changé.
   Consulter le <a href="https://github.com/PCRE2Project/pcre2/blob/master/NEWS" class="link external">&raquo;&nbsp;Journal des modifications de PCRE2</a>
   pour un journal des modifications complet.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pdo-dblib">
  <h3 class="title">PDO_DBLIB</h3>

  <p class="simpara">
   Les attributs <strong><code><a href="class.pdo-dblib.php#pdo-dblib.constants.attr-stringify-uniqueidentifier">Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER</a></code></strong> et
   <strong><code><a href="class.pdo-dblib.php#pdo-dblib.constants.attr-datetime-convert">Pdo\Dblib::ATTR_DATETIME_CONVERT</a></code></strong> agissent désormais comme des
   attributs booléens au lieu d&#039;attributs entiers.
   Donc définir l&#039;attribut via <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   et le récupérer via <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> attend
   et retourne un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pdo-firebird">
  <h3 class="title">PDO_FIREBIRD</h3>

  <p class="simpara">
   L&#039;attribut <strong><code><a href="pdo.constants.php#pdo.constants.attr-autocommit">PDO::ATTR_AUTOCOMMIT</a></code></strong> agit désormais comme un
   attribut booléen au lieu d&#039;un attribut entier.
   Donc définir l&#039;attribut via <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   et le récupérer via <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> attend
   et retourne un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
  </p>

  <p class="simpara">
   L&#039;extension expose désormais certaines API C++ Firebird,
   donc la construction de cette extension nécessite désormais un compilateur C++.
   De plus, l&#039;extension doit désormais être compilée contre fbclient 3.0 ou supérieur.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pdo-mysql">
  <h3 class="title">PDO_MYSQL</h3>

  <p class="simpara">
   Les attributs <strong><code><a href="pdo.constants.php#pdo.constants.attr-autocommit">PDO::ATTR_AUTOCOMMIT</a></code></strong>,
   <strong><code><a href="pdo.constants.php#pdo.constants.attr-emulate-prepares">PDO::ATTR_EMULATE_PREPARES</a></code></strong>, et
   <strong><code><a href="ref.pdo-mysql.php#pdo.constants.mysql-attr-direct-query">PDO::MYSQL_ATTR_DIRECT_QUERY</a></code></strong> agissent désormais comme des
   attributs booléens au lieu d&#039;attributs entiers.
   Donc définir l&#039;attribut via <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   et le récupérer via <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> attend
   et retourne un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pdo-pgsql">
  <h3 class="title">PDO_PGSQL</h3>

  <p class="simpara">
   Les informations de connexion DSN, lorsqu&#039;elles sont définies, ont la priorité sur 
   les arguments du constructeur PDO, étant plus proches de ce que la documentation indique.
  </p>
 </div>

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

  <p class="simpara">
   <span class="classname"><a href="class.simplexmlelement.php" class="classname">SimpleXMLElement</a></span> n&#039;est pas seulement une représentation
   d&#039;un élément XML, mais c&#039;est aussi un <span class="classname"><a href="class.recursiveiterator.php" class="classname">RecursiveIterator</a></span>.
   Avant PHP 8.4.0, certaines de ses méthodes (par exemple
   <span class="methodname"><a href="simplexmlelement.asxml.php" class="methodname">SimpleXMLElement::asXML()</a></span> ou
   <span class="methodname"><a href="simplexmlelement.getname.php" class="methodname">SimpleXMLElement::getName()</a></span>) et le casting de telles
   instances en <a href="language.types.string.php" class="link">chaîne de caractères</a> réinitialisaient implicitement l&#039;itérateur.
  </p>
  <p class="para">
   Cela pouvait entraîner des boucles infinies inattendues car l&#039;itérateur était réinitialisé.
   Par exemple :
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$xmlString </span><span style="color: #007700">= </span><span style="color: #DD0000">"&lt;root&gt;&lt;a&gt;&lt;b&gt;1&lt;/b&gt;&lt;b&gt;2&lt;/b&gt;&lt;b&gt;3&lt;/b&gt;&lt;/a&gt;&lt;/root&gt;"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$xml </span><span style="color: #007700">= </span><span style="color: #0000BB">simplexml_load_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$xmlString</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$nodes </span><span style="color: #007700">= </span><span style="color: #0000BB">$xml</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">b</span><span style="color: #007700">;<br />foreach (</span><span style="color: #0000BB">$nodes </span><span style="color: #007700">as </span><span style="color: #0000BB">$nodeData</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"nodeData: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$nodeData </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br />    </span><span style="color: #0000BB">$xml </span><span style="color: #007700">= </span><span style="color: #0000BB">$nodes</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">asXml</span><span style="color: #007700">();<br />}</span></span></code></div>
    </div>

    <p class="simpara">
     formait une boucle infinie.
    </p>
    <div class="example-contents screen">
<div class="cdata"><pre>
nodeData: 1
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
// ...
</pre></div>
    </div>
    <p class="simpara">
     Cependant, ce comportement a été corrigé, et un
     <span class="classname"><a href="class.simplexmlelement.php" class="classname">SimpleXMLElement</a></span> ne réinitialisera plus implicitement
     l&#039;itérateur, sauf s&#039;il est explicitement remis à zéro.
     Cela signifie que l&#039;exemple précédent donnerait maintenant :
    </p>
    <div class="example-contents screen">
<div class="cdata"><pre>
nodeData: 1
nodeData: 2
nodeData: 3
</pre></div>
    </div>
   </div>
  </p>
  
 </div>

 <div class="sect2" id="migration84.incompatible.soap">
  <h3 class="title">SOAP</h3>

  <p class="simpara">
   <span class="property"><a href="class.soapclient.php#soapclient.props.typemap">SoapClient::$typemap</a></span> est désormais un <span class="type"><a href="language.types.array.php" class="type array">array</a></span>
   plutôt qu&#039;une <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
   Les vérifications à l&#039;aide de <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (c&#039;est-à-dire
   <code class="code">is_resource($client-&gt;typemap)</code>) doivent être remplacées par des
   vérifications de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (c&#039;est-à-dire <code class="code">$client-&gt;typemap !== null</code>).
  </p>

  <p class="simpara">
   L&#039;extension SOAP a gagné une dépendance optionnelle sur l&#039;extension
   <a href="book.session.php" class="link">session</a>.
   Si PHP est compilé sans l&#039;extension session et avec le drapeau de configuration
   <strong class="option unknown">--enable-rtld-now</strong> activé, des erreurs de démarrage se produiront
   désormais si l&#039;extension <a href="book.soap.php" class="link">SOAP</a> est également utilisée.
   Pour résoudre ce problème, ne pas utiliser rtld-now ou charger l&#039;extension session.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.standard">
  <h3 class="title">Standard</h3>

  <p class="simpara">
   Lors de l&#039;utilisation de <span class="function"><a href="function.strcspn.php" class="function">strcspn()</a></span> avec
   <code class="parameter">characters</code> étant une chaîne vide,
   la longueur de la chaîne est désormais retournée au lieu de s&#039;arrêter
   au premier octet nul.
   
  </p>

  <p class="simpara">
   <span class="function"><a href="function.http-build-query.php" class="function">http_build_query()</a></span> gère désormais correctement les énumérations
  </p>

  
  <p class="simpara">
   <span class="function"><a href="function.stream-bucket-make-writeable.php" class="function">stream_bucket_make_writeable()</a></span> et
   <span class="function"><a href="function.stream-bucket-new.php" class="function">stream_bucket_new()</a></span> retournent désormais une instance de
   <span class="classname"><strong class="classname">StreamBucket</strong></span> à la place d&#039;une instance de 
   <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.tidy">
  <h3 class="title">Tidy</h3>

  <p class="simpara">
   Les échecs dans le constructeur lancent désormais des exceptions plutôt que
   d&#039;émettre des alertes et d&#039;avoir un objet cassé.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.xml">
  <h3 class="title">XML</h3>

  <p class="simpara">
   Les fonctions <span class="function">xml_set_<span class="replaceable">*</span>_handler</span>
   déclarent désormais et vérifient une signature
   effective de <span class="type"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>|<span class="type"><a href="language.types.string.php" class="type string">string</a></span>|<span class="type"><a href="language.types.null.php" class="type null">null</a></span></span> pour les
   paramètres <code class="parameter">handler</code>.
   De plus les valeurs de type <span class="type"><a href="language.types.string.php" class="type string">string</a></span> correspondant à des noms de méthode,
   d&#039;objet défini avec <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> sont désormais vérifiées pour 
   voir si la méthode existe sur la classe de l&#039;objet précédemment passé.
   Cela signifie que <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> doit maintenant toujours être
   appelée avant de définir des noms de méthode en tant que <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>.
   Passer une chaîne vide pour désactiver le gestionnaire est toujours autorisé,
   mais déprécié.
  </p>

  <p class="simpara">
   De plus, avec <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> et le passage de chaînes
   non-<span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> est déprécié.
   Il est recommandé de remplacer de telles instances par un <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>
   se référant directement à la méthode.
  </p>
 </div>

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