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

contributors($setup);

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


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

  <div class="sect3" id="migration74.incompatible.core.non-array-access">
   <h4 class="title">Accès de type tableau des non-tableaux</h4>

   <p class="para">
    Essayer d&#039;utiliser des valeurs de type <span class="type"><a href="language.types.null.php" class="type null">null</a></span>, <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>, <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, <span class="type"><a href="language.types.float.php" class="type float">float</a></span> ou <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> comme un tableau (comme <code class="literal">$null[&quot;clé&quot;]</code>) va maintenant générer un avis.
    
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.get-declared-classes">
   <h4 class="title">Fonction <span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span></h4>

   <p class="para">
    La fonction <span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span> ne renvoie plus les 
    classes anonymes qui n&#039;ont pas encore été instanciées.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fn">
   <h4 class="title">mot-clé <code class="literal">fn</code></h4>

   <p class="para">
    <code class="literal">fn</code> est maintenant un mot-clé réservé. En particulier, il ne 
    peut plus être utilisé comme une fonction ou un nom de classe.
    Il peut encore être utilisé comme une méthode ou un nom de constante de classe.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.php-tag">
   <h4 class="title"><code class="literal">&lt;?php</code> tag à la fin du fichier</h4>

   <p class="para">
    <code class="literal">&lt;?php</code> à la fin du fichier (sans nouvelle ligne)
     sera désormais interprété comme une balise PHP d&#039;ouverture.  Auparavant, il 
    était interprété soit comme une balise courte d&#039;ouverture suivie d&#039;une 
    <code class="literal">php</code> littérale et aboutissait à une erreur de syntaxe 
    (avec <code class="literal">short_open_tag=1</code>) ou était interprété comme une chaîne 
    <code class="literal">&lt;?php</code> (avec  <code class="literal">short_open_tag=0</code>).
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.stream-wrappers">
   <h4 class="title">Enveloppes de flux</h4>

   <p class="para">
    Lors de l&#039;utilisation de include/require sur un flux, 
    <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span> sera invoqué avec 
    l&#039;option <strong><code><a href="stream.constants.php#constant.stream-option-read-buffer">STREAM_OPTION_READ_BUFFER</a></code></strong>.
    Les implémentations de filtre de flux personnalisés peuvent avoir besoin 
    d&#039;implémenter la méthode  <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span> 
    pour éviter un avertissement (toujours retourner <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> est une implémentation suffisante).
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.serialization">
   <h4 class="title">Sérialisation</h4>

   <p class="para">
    Le format <code class="literal">o</code> de sérialisation a été supprimé.
    Comme il n&#039;est jamais produit par PHP, cela peut seulement briser la désérialisation 
    des chaînes construites manuellement.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.password-algorithm-constants">
   <h4 class="title">Constantes d&#039;algorithme de mot de passe</h4>

   <p class="para">
    Les identificateurs d&#039;algorithme de hachage de mot de passe sont maintenant des chaînes nullables plutôt que des entiers.
   </p>

   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-default">PASSWORD_DEFAULT</a></code></strong> était l&#039;entier 1 ; maintenant c&#039;est la chaîne &#039;2y&#039;
      (en PHP 7.4.0, 7.4.1, et 7.4.2 c&#039;était <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>)
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong> était l&#039;entier 1; maintenant c&#039;est &#039;2y&#039;
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong>  était l&#039;entier 2; maintenant c&#039;est &#039;argon2i&#039;
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong>  était l&#039;entier 3; maintenant c&#039;est &#039;argon2id&#039;
     </span>
    </li>
   </ul>

   <p class="para">
    Les applications utilisant correctement les constantes PASSWORD_DEFAULT,
    PASSWORD_BCRYPT, PASSWORD_ARGON2I, et PASSWORD_ARGON2ID continueront à 
    fonctionner correctement.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.htmlentities">
   <h4 class="title">Fonction <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span></h4>

   <p class="para">
    <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span> va maintenant lever un avis (au lieu d&#039;un 
    avertissement de normes strictes) s&#039;il est utilisé avec un codage pour lequel 
    seule la substitution d&#039;entité de base est supportée, auquel cas il est 
    équivalent à <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fread-fwrite">
   <h4 class="title">Les fonctions <span class="function"><a href="function.fread.php" class="function">fread()</a></span> et <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span></h4>

   <p class="para">
     <span class="function"><a href="function.fread.php" class="function">fread()</a></span> et <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span> vont maintenant retourner <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si l&#039;opération échoue.
    Auparavant, une chaîne vide ou 0 était retourné(e).
    EAGAIN/EWOULDBLOCK ne sont pas considérés comme des échecs.
   </p>
   <p class="para">
    Ces fonctions soulèvent également un avis sur l&#039;échec, par exemple lorsque 
    l&#039;on tente d&#039;écrire dans une ressource de fichier en lecture seule.
   </p>
  </div>

 </div>

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

  <p class="para">
   Les fonctions BCMath avertiront désormais si un nombre non bien formé est 
   passé, tel que <code class="literal">&quot;32foo&quot;</code>. L&#039;argument sera interprété comme 
   zéro, comme avant.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.curl">
  <h3 class="title">CURL</h3>

  <p class="para">
   Tenter de sérialiser une classe <span class="classname"><a href="class.curlfile.php" class="classname">CURLFile</a></span> va maintenant 
   générer une exception. Auparavant, l&#039;exception n&#039;était lancée que sur la désérialisation.
  </p>
  <p class="para">
   L&#039;utilisation de <strong><code><a href="curl.constants.php#constant.curlpipe-http1">CURLPIPE_HTTP1</a></code></strong> est dépréciée et n&#039;est plus 
   prise en charge à partir de cURL 7.62.0.
  </p>
  <p class="para">
   Le paramètre <code class="literal">$version</code> de <span class="function"><a href="function.curl-version.php" class="function">curl_version()</a></span> 
   est déprécié. Si une valeur n&#039;est pas égale à la valeur par défaut
   <strong><code><a href="curl.constants.php#constant.curlversion-now">CURLVERSION_NOW</a></code></strong> est passé, un avertissement est levé et 
   le paramètre est ignoré.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.datetime">
  <h3 class="title">Date et heure</h3>

  <p class="para">
   Appeler <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> ou similaire sur une instance  
   <span class="classname"><a href="class.datetime.php" class="classname">DateTime</a></span> ou <span class="classname"><a href="class.datetimeimmutable.php" class="classname">DateTimeImmutable</a></span> ne 
   laissera plus de propriétés accessibles sur l&#039;objet.
  </p>
  <p class="para">
   La comparaison des objets <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span> (à l&#039;aide de 
   <code class="literal">==</code>, <code class="literal">&lt;</code>, etc.) va maintenant générer 
   un avertissement et toujours retourner <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>. Auparavant, tous les objets
   <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span> étaient considérés comme égaux, 
   à moins qu&#039;ils n&#039;aient des propriétés.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.intl">
  <h3 class="title">Intl</h3>

  <p class="para">
   La valeur par défaut du paramètre de <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> et
   <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span> est maintenant <strong><code><a href="intl.constants.php#constant.intl-idna-variant-uts46">INTL_IDNA_VARIANT_UTS46</a></code></strong>
   au lieu de la valeur déconseillée <strong><code><a href="intl.constants.php#constant.intl-idna-variant-2003">INTL_IDNA_VARIANT_2003</a></code></strong>.
  </p>
 </div>

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

  <p class="para">
   La fonctionnalité du serveur intégré a été supprimée. Elle a été cassée depuis 
   au moins PHP 7.0.
  </p>
  <p class="para">
   La propriété non documentée <code class="literal">mysqli::$stat</code> a été supprimée au 
   profit de <span class="methodname"><a href="mysqli.stat.php" class="methodname">mysqli::stat()</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.openssl">
  <h3 class="title">OpenSSL</h3>

  <p class="para">
   La fonction <span class="function"><a href="function.openssl-random-pseudo-bytes.php" class="function">openssl_random_pseudo_bytes()</a></span>
   lance une exception dans les situations d&#039;erreur, semblable à <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span>.
   En particulier, une <span class="classname"><a href="class.error.php" class="classname">Error</a></span> est lancée si le nombre d&#039;octets demandés est inférieur ou égal à zéro, et une  <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> est lancée si un caractère aléatoire suffisant ne peut pas être recueilli.
   L&#039;argument de sortie <code class="literal">$crypto_strong</code> est garanti d&#039;être toujours <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> si la fonction ne lance pas d&#039;exception, afin de vérifier explicitement qu&#039;il n&#039;est pas nécessaire.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.pcre">
  <h3 class="title">Expressions régulières (compatible Perl)</h3>

  <p class="para">
   Lorsque le mode <strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong> est utilisé, les 
   groupes de capture non trouvés seront désormais également réglés à <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (ou 
   <code class="literal">[null, -1]</code> si la capture offset est activée).   Cela signifie 
   que la taille de  <code class="literal">$matches</code> sera toujours la même.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.pdo">
  <h3 class="title">PHP Data Objects</h3>

  <p class="para">
   Une tentative de sérialisation d&#039;une instance de <span class="classname"><a href="class.pdo.php" class="classname">PDO</a></span> ou
   <span class="classname"><a href="class.pdostatement.php" class="classname">PDOStatement</a></span>  va désormais générer une 
   <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> plutôt qu&#039;une <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span>, 
   compatible avec d&#039;autres classes internes qui ne prennent pas en charge la sérialisation.
  </p>
 </div>

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

  <p class="para">
   Les objets Reflection génèrent désormais une exception si une tentative est faite 
   pour les sérialiser. La sérialisation des objets Reflection n&#039;a jamais été prise 
   en charge et a donné lieu à des objets Reflection corrompus. Il a été explicitement 
   interdit maintenant.
  </p>

  <p class="para">
   La valeur des constantes de classe de <span class="classname"><a href="class.reflectionclassconstant.php" class="classname">ReflectionClassConstant</a></span>,
   <span class="classname"><a href="class.reflectionmethod.php" class="classname">ReflectionMethod</a></span> et <span class="classname"><a href="class.reflectionproperty.php" class="classname">ReflectionProperty</a></span>
   ont été changées.
  </p>
 </div>

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

  <p class="para">
   L&#039;appel <span class="function"><a href="function.get-object-vars.php" class="function">get_object_vars()</a></span> sur une instance   
   <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span> retournera toujours les propriétés de 
   l&#039;<span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span> lui-même (ou d&#039;une sous-classe).
   Auparavant, il retournait les valeurs du tableau/objet à moins que le drapeau 
   <strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong> n&#039;ait été spécifié.
  </p>
  <p class="para">
   Les autres opérations touchées sont les suivantes :
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="methodname"><strong>ReflectionObject::getProperties()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.reset.php" class="function">reset()</a></span>, <span class="function"><a href="function.current.php" class="function">current()</a></span>, etc.
     Utiliser plutôt les méthodes d&#039;<span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Potentiellement d&#039;autres fonctions travaillant sur les propriétés de l&#039;objet comme une liste,
     par exemple <span class="function"><a href="function.array-walk.php" class="function">array_walk()</a></span>.
    </span>
   </li>
  </ul>
  <p class="para">
   Les modifications de type <code class="literal">(array)</code> ne sont pas affectées. 
   Elles continueront à retourner soit le tableau enveloppé, soit les propriétés 
   <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>, selon que le drapeau 
   <strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong> est utilisé.
  </p>
  <p class="para">
   <span class="methodname"><a href="splpriorityqueue.setextractflags.php" class="methodname">SplPriorityQueue::setExtractFlags()</a></span> lancera une exception 
   si zéro est passé. Auparavant, cela générerait une erreur fatale récupérable 
   lors de la prochaine opération d&#039;extraction.
  </p>
  <p class="para">
   <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>, <span class="classname"><a href="class.arrayiterator.php" class="classname">ArrayIterator</a></span>,
   <span class="classname"><a href="class.spldoublylinkedlist.php" class="classname">SplDoublyLinkedList</a></span> et <span class="classname"><a href="class.splobjectstorage.php" class="classname">SplObjectStorage</a></span>
   gèrent maintenant <code class="literal">__serialize()</code> et <code class="literal">__unserialize()</code>
   en plus de l&#039;interface <span class="interfacename"><a href="class.serializable.php" class="interfacename">Serializable</a></span>.
   Cela signifie que les charges utiles de sérialisation créées sur les anciennes 
   versions PHP peuvent toujours être désérialisées, mais les nouvelles charges 
   utiles créées par PHP 7.4 ne seront pas compatibles par les anciennes versions.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.tokenizer">
  <h3 class="title">Tokenizer</h3>

  <p class="para">
   <span class="function"><a href="function.token-get-all.php" class="function">token_get_all()</a></span> émettra maintenant un jeton 
   <strong><code><a href="tokens.php#constant.t-bad-character">T_BAD_CHARACTER</a></code></strong> pour les caractères inattendus au lieu de 
   laisser derrière eux des trous dans le flux de jetons.
  </p>
 </div>

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

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

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