<?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"><a href="class.odbc-result.php" class="classname">Odbc\Result</a></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"><a href="class.odbc-connection.php" class="classname">Odbc\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">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"><a href="class.soap-url.php" class="classname">Soap\Url</a></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"><a href="class.soap-sdl.php" class="classname">Soap\Sdl</a></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 une
    <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> et une
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si ce n&#039;est ni un
    <span class="type"><a href="language.types.array.php" class="type array">array</a></span> de noms de classe, ni un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
   </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
    désormais une exception 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">
   À partir de PHP 8.3.2, 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> et <span class="function"><a href="function.mb-strstr.php" class="function">mb_strstr()</a></span>
   interprètent 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 <code class="literal">SJIS-mac</code> (MacJapanese), ces indices de
   caractères font référence aux indices des points de code Unicode qui sont
   produits lorsque la chaîne est convertie en Unicode, lesquels diffèrent des
   indices de caractères pour les caractères <code class="literal">SJIS-mac</code> qui se
   convertissent en une séquence de plusieurs points de code.
  </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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

$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">;
</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">);

</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">;
foreach (</span><span style="color: #0000BB">$nodes </span><span style="color: #007700">as </span><span style="color: #0000BB">$nodeData</span><span style="color: #007700">) {
    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">;

    </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">();
}</span></code></pre></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 dotées d&#039;une valeur.
  </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"><a href="class.streambucket.php" class="classname">StreamBucket</a></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); ?>