<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'migration84.incompatible.php',
    1 => 'Altera&ccedil;&otilde;es Incompat&iacute;veis com Vers&otilde;es Anteriores',
    2 => 'Altera&ccedil;&otilde;es Incompat&iacute;veis com Vers&otilde;es Anteriores',
  ),
  'up' => 
  array (
    0 => 'migration84.php',
    1 => 'Migrando do PHP 8.3.x para o PHP 8.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration84.constants.php',
    1 => 'Novas Constantes Globais',
  ),
  'next' => 
  array (
    0 => 'migration84.deprecated.php',
    1 => 'Recursos Descontinuados',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    '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">Alterações Incompatíveis com Versões Anteriores</h2>

 <p class="simpara">
  Embora não seja explicitamente citado nesta seção,
  cada nova <a href="migration84.new-functions.php" class="link">função</a>,
  <a href="migration84.new-classes.php" class="link">classe, interface, enumeração</a>,
  ou <a href="migration84.constants.php" class="link">constante</a>
  pode fazer com que uma exceção de redeclaração do tipo <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span> seja lançada.
 </p>

 <div class="sect2" id="migration84.incompatible.core">
  <h3 class="title">Núcleo do PHP</h3>

  
  <div class="sect3" id="migration84.incompatible.core.exit">
   <h4 class="title">Alteração de comportamento de <span class="function"><a href="function.exit.php" class="function">exit()</a></span></h4>

   <p class="simpara">
    As construções de linguagem <span class="function"><a href="function.exit.php" class="function">exit()</a></span> (e <span class="function"><a href="function.die.php" class="function">die()</a></span>)
    agora se comportam mais como uma função.
    Isso significa que elas agora podem ser passadas ​​como <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>s,
    
    são afetadas pela instrução declare <code class="literal">strict_types</code>
    e agora executam as coerções de tipo usuais em vez de converter qualquer valor
    não inteiro para uma string.
   </p>

   <p class="simpara">
    Sendo assim, passar tipos inválidos para <span class="function"><a href="function.exit.php" class="function">exit()</a></span> e
    <span class="function"><a href="function.die.php" class="function">die()</a></span> agora resultam, consistentemente, no
    lançamento de um <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">Recursão durante comparação</h4>

   <p class="simpara">
    Encontrar recursão durante uma comparação agora resulta em
    exceção <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span> ao invés de
    erro fatal <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">Modificação indireta de propriedades somente leitura</h4>

   
   <p class="simpara">
    A modificação indireta de propriedades somente leitura em <code class="code">__clone()</code>
    não é mais permitida, por exemplo, <code class="code">$ref = &amp;$this-&gt;somente_leitura</code>.
    Isso já era proibido para inicialização somente leitura e foi um
    descuido na implementação de &quot;reinicialização somente leitura durante a clonagem&quot;.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.constant-type-change">
   <h4 class="title">Alteração de Tipo de Constantes</h4>

   <p class="simpara">
    As constantes <strong><code><a href="reserved.constants.php#constant.php-debug">PHP_DEBUG</a></code></strong> e <strong><code><a href="reserved.constants.php#constant.php-zts">PHP_ZTS</a></code></strong>
    agora são do tipo <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
    Anteriormente eram do tipo <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">Comprimento de nome de arquivo temporário</h4>

   <p class="simpara">
    O nome dos arquivos enviados e criados pela função
    <span class="function"><a href="function.tempnam.php" class="function">tempnam()</a></span> agora tem 13 bytes a mais.
    O comprimento total ainda depende da plataforma.
   </p>
  </div>

  
  <div class="sect3" id="migration84.incompatible.core.e-strict">
   <h4 class="title">Remoção do nível de erro <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong></h4>

   <p class="simpara">
    O nível de erro <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> foi removido,
    pois não estava mais em uso no mecanismo PHP.
    A constante <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> foi descontinuada.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.typed-constants">
  <h3 class="title">Constantes de classe de extensão que agora são tipadas</h3>

  <p class="para">
   As seguintes classes de extensões agora declaram um tipo em suas
   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">Migração de recurso para objeto</h3>

  <p class="simpara">
   Vários <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s migraram para <span class="type"><a href="language.types.object.php" class="type object">object</a></span>s.
   As verificações do valor de retorno usando <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> devem ser
   substituídas por verificações de <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, a menos que especificado de outra forma.
  </p>

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

   <p class="simpara">
    As funções <a href="book.dba.php" class="link">DBA</a> agora aceitam e retornam
    objetos <span class="classname"><a href="class.dba-connection.php" class="classname">Dba\Connection</a></span> ao invés 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">
    As funções <a href="book.uodbc.php" class="link">ODBC</a> agora aceitam e retornam
    objetos <span class="classname"><strong class="classname">Odbc\Result</strong></span> ao invés 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">
    As funções <a href="book.uodbc.php" class="link">ODBC</a> agora aceitam e retornam
    objetos <span class="classname"><strong class="classname">Odbc\Connection</strong></span> ao invés 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">
    A propriedade <span class="property"><a href="class.soapclient.php#soapclient.props.httpurl">SoapClient::$httpurl</a></span> agora é um
    objeto <span class="classname"><strong class="classname">Soap\Url</strong></span> ao invés de um
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="literal">soap_url</code>.
    Verificações que usam <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (ou seja,
    <code class="code">is_resource($client-&gt;httpurl)</code>) devem ser substituídas por verificações
    de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (isto é, <code class="code">$client-&gt;httpurl !== null</code>).
   </p>
   <p class="simpara">
    A propriedade <span class="property"><a href="class.soapclient.php#soapclient.props.sdl">SoapClient::$sdl</a></span> agora é um
    objeto <span class="classname"><strong class="classname">Soap\Sdl</strong></span> ao invés de um
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="literal">soap_sdl</code>.
    Verificações que usam <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (ou seja,
    <code class="code">is_resource($client-&gt;sdl)</code>) devem ser substituídas por verificações
    de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (i.e. <code class="code">$client-&gt;sdl !== null</code>).
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.new-warnings-exceptions">
  <h3 class="title">Novos alertas e exceções</h3>

  <p class="simpara">
   Foram adicionados novos alertas e exceções que são acionados em
   erros de programação, ou seja, valores inválidos fornecidos como argumentos.
  </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> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se o
    parâmetro <code class="parameter">timeout</code> for menor que
    <code class="literal">0</code> ou maior que <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>
    agora lançam um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> quando um
    parâmetro <code class="parameter">quality</code> inválido for passado.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imageavif.php" class="function">imageavif()</a></span> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se um
    parâmetro <code class="parameter">speed</code> inválido for passado.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagescale.php" class="function">imagescale()</a></span> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se os parâmetros
    <code class="parameter">width</code> ou <code class="parameter">height</code>
    ultrapassarem os limites inferiores ou superiores.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagescale.php" class="function">imagescale()</a></span> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se um valor de
    parâmetro <code class="parameter">mode</code> inválido for passado.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagefilter.php" class="function">imagefilter()</a></span> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> com o
    filtro <strong><code><a href="image.constants.php#constant.img-filter-scatter">IMG_FILTER_SCATTER</a></code></strong>
    se os parâmetros <code class="parameter">sub</code> ou <code class="parameter">plus</code>
    ultrapassarem os limites inferiores ou superiores.
   </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>
    agora lançam um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se
    <code class="parameter">domain</code> for uma string vazia.
   </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="methodname"><a href="resourcebundle.get.php" class="methodname">ResourceBundle::get()</a></span>, e acessar deslocamentos em um
    objeto <span class="classname"><a href="class.resourcebundle.php" class="classname">ResourceBundle</a></span> agora lançam:
    <ul class="simplelist">
     <li>
      <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> para tipos de deslocamento inválidos
     </li>
     <li>
      <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> para uma <span class="type"><a href="language.types.string.php" class="type string">string</a></span> vazia
     </li>
     <li>
      <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se o índice inteiro não
      couber em uma representação de inteiro de 32 bits com sinal
     </li>
    </ul>
   </p>

   <p class="simpara">
    <span class="methodname"><a href="intldateformatter.create.php" class="methodname">IntlDateFormatter::__construct()</a></span> lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se
    <code class="parameter">locale</code> for inválido.
   </p>

   <p class="simpara">
    <span class="methodname"><a href="numberformatter.create.php" class="methodname">NumberFormatter::__construct()</a></span> lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se
    <code class="parameter">locale</code> for inválido.
   </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> e
    <span class="function"><a href="function.mb-decode-numericentity.php" class="function">mb_decode_numericentity()</a></span> agora verificam se
    <code class="parameter">map</code> consiste somente de <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>s,
    senão um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> é lançado.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.mb-http-input.php" class="function">mb_http_input()</a></span> agora sempre lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se <code class="parameter">type</code>
    for inválido.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.mb-http-output.php" class="function">mb_http_output()</a></span> agora verifica se
    <code class="parameter">encoding</code> não contém nenhum byte nulo,
    se contiver, um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> será lançado.
   </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> retorna <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> quando
    <code class="parameter">row</code> for menor ou igual a <code class="literal">0</code>.
    Um alerta agora é emitido neste caso.
   </p>
  </div>

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

   <p class="para">
    As funções <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> e
    <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> agora lançam:
    <ul class="simplelist">
     <li>
      Um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se o
      array <code class="parameter">signals</code> estiver vazio
      (exceto para <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span> se
      <code class="parameter">mode</code> for igual a <strong><code><a href="pcntl.constants.php#constant.sig-setmask">SIG_SETMASK</a></code></strong>)
     </li>
     <li>
      Um <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> se um valor do
      array <code class="parameter">signals</code> não for um <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>
     </li>
     <li>
      Um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se um valor do
      array <code class="parameter">signals</code> não for um número de sinal válido.
     </li>
    </ul>
   </p>

   <p class="simpara">
    A função <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se
    <code class="parameter">mode</code> não for uma das constantes <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">
    A função <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> agora lança:
    <ul class="simplelist">
     <li>
      Um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se
      <code class="parameter">seconds</code> for menor que <code class="literal">0</code>
     </li>
     <li>
      Um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se
      <code class="parameter">nanoseconds</code> for menor que <code class="literal">0</code>
      ou maior que <code class="literal">1e9</code>
     </li>
     <li>
      Um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se ambos
      <code class="parameter">seconds</code> e <code class="parameter">nanoseconds</code>
      forem <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">
    Definir um valor não positivo para <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a>
    ou um valor negativo para <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
    agora emite um alerta.
   </p>
  </div>

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

   <p class="simpara">
    Chamar <span class="function"><a href="function.simplexml-import-dom.php" class="function">simplexml_import_dom()</a></span> com um objeto não-XML
    agora lança um <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> ao invés de um
    <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">
    A função <span class="function"><a href="function.round.php" class="function">round()</a></span> agora valida o valor de
    <code class="parameter">mode</code> e lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> para modos inválidos.
    Anteriormente, modos inválidos seria interpretados como
    <strong><code><a href="math.constants.php#constant.php-round-half-up">PHP_ROUND_HALF_UP</a></code></strong>.
   </p>

   <p class="simpara">
    A função <span class="function"><a href="function.str-getcsv.php" class="function">str_getcsv()</a></span> agora lança
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>s quando
    os argumentos <code class="parameter">separator</code> e <code class="parameter">enclosure</code>
    não tiverem comprimento de um byte, ou se o argumento <code class="parameter">escape</code>
    não tiver um byte de comprimento e nem for uma string vazia.
    Isto alinha o comportamento para ficar idêntico ao de
    <span class="function"><a href="function.fputcsv.php" class="function">fputcsv()</a></span> e <span class="function"><a href="function.fgetcsv.php" class="function">fgetcsv()</a></span>.
   </p>

   <p class="simpara">
    A função <span class="function"><a href="function.php-uname.php" class="function">php_uname()</a></span> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> se
    <code class="parameter">mode</code> for inválido.
   </p>

   <p class="simpara">
    A opção <code class="literal">&quot;allowed_classes&quot;</code> para
    <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> agora lança
    <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span>s e
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>s se não for um
    <span class="type"><a href="language.types.array.php" class="type array">array</a></span> de nomes de classe.
   </p>
  </div>

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

   <p class="simpara">
    Passar uma codificação de caracteres inválidos para
    <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> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>

   <p class="simpara">
    Passar uma <span class="type"><a href="language.types.string.php" class="type string">string</a></span> contendo bytes nulos anteriormente emitia um
    alerta, e agora lança um <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">
    Passar uma <span class="type"><a href="language.types.string.php" class="type string">string</a></span> contendo bytes nulos anteriormente emitia um
    alerta, e agora lança um <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> agora lança um
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> quando seus argumentos contiverem bytes
    nulos. Isto nunca funcionou corretamente na verdade,
    e é por isso que agora lança uma exceção.
   </p>

   <p class="simpara">
    Chamar <span class="methodname"><a href="xsltprocessor.importstylesheet.php" class="methodname">XSLTProcessor::importStyleSheet()</a></span> com um
    objeto não-XML agora lança um <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span>
    ao invés de um <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>

   
   <p class="simpara">
    Falha ao chamar uma função de retorno do PHP durante uma avaliação agora lança uma exceção
    ao invés de emitir um alerta.
   </p>
  </div>
 </div>

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

  <p class="para">
   Símbolos de <code class="literal">number</code> em <a href="datetime.formats.php#datetime.formats.relative" class="link">formatos relativos</a>
   novamente aceitam múltiplos sinais, por exemplo, <code class="literal">+-2</code>.
  </p>
 </div>

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

  <p class="simpara">
   Alguns métodos DOM anteriormente retornavam <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> ou uma exceção
   <span class="exceptionname"><a href="class.domexception.php" class="exceptionname">DOMException</a></span> com código
   <strong><code><a href="dom.constants.php#constant.dom-php-err">DOM_PHP_ERR</a></code></strong> se um novo nó não pudesse ser alocado.
   Eles agora lançam consistentemente uma exceção <span class="exceptionname"><a href="class.domexception.php" class="exceptionname">DOMException</a></span>
   com código <strong><code><a href="dom.constants.php#constant.dom-invalid-state-err">DOM_INVALID_STATE_ERR</a></code></strong>.
   Esta situação é extremamente improvável e a probabilidade de ser afetado
   é baixa.
   Como resultado, <span class="methodname"><a href="domimplementation.createdocument.php" class="methodname">DOMImplementation::createDocument()</a></span>
   agora tem um tipo de retorno provisório de <span class="classname"><a href="class.domdocument.php" class="classname">DOMDocument</a></span>
   
   em vez de <code class="code">DOMDocument|false</code>.
  </p>

  <p class="simpara">
   Anteriormente, os objetos <span class="classname"><a href="class.domxpath.php" class="classname">DOMXPath</a></span> podiam ser clonados,
   mas resultavam em um objeto inutilizável.
   Isso não é mais possível, e clonar um objeto <span class="classname"><a href="class.domxpath.php" class="classname">DOMXPath</a></span>
   agora lança um <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span>.
  </p>

  
  <p class="simpara">
   O método <span class="methodname"><strong>DOMImplementation::getFeature()</strong></span> foi removido.
  </p>
 </div>

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

  
  <p class="simpara">
   A classe <span class="classname"><a href="class.gmp.php" class="classname">GMP</a></span> agora é final e não pode mais ser
   estendida.
  </p>
 </div>

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

  <p class="simpara">
   Em strings inválidas (aquelas com erros de codificação),
   <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span> agora interpreta índices de caracteres da mesma
   maneira que a maioria das outras funções mbstring.
   Isto significa que os índices de caracteres retornados por <span class="function"><a href="function.mb-strpos.php" class="function">mb_strpos()</a></span>
   podem ser passados ​​para <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span>.
  </p>

  <p class="simpara">
   Para strings SJIS-Mac (Mac japonês), os índices de caracteres passados ​​para
   <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span> agora se referem aos índices dos pontos de
   código Unicode que são produzidos quando a string é convertida para Unicode.
   Isso é significativo porque cerca de 40 caracteres SJIS-Mac são convertidos em uma
   sequência de vários pontos de código Unicode.
  </p>
 </div>

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

  <p class="simpara">
   A constante não utilizada e não documentada
   <strong><code>MYSQLI_SET_CHARSET_DIR</code></strong> foi removida.
  </p>

  <p class="simpara">
   A constante <strong><code><a href="mysqli.constants.php#constant.mysqli-stmt-attr-prefetch-rows">MYSQLI_STMT_ATTR_PREFETCH_ROWS</a></code></strong> foi removida.
   O recurso não está disponível no mysqlnd.
  </p>

  <p class="simpara">
   As constantes <strong><code><a href="mysqli.constants.php#constant.mysqli-cursor-type-for-update">MYSQLI_CURSOR_TYPE_FOR_UPDATE</a></code></strong> e
   <strong><code><a href="mysqli.constants.php#constant.mysqli-cursor-type-scrollable">MYSQLI_CURSOR_TYPE_SCROLLABLE</a></code></strong> foram removidas.
   Esta funcionalidade nunca foi implementada,
   nem com mysqlnd nem com libmysql.
  </p>

  <p class="simpara">
   A constante <strong><code><a href="mysqli.constants.php#constant.mysqli-type-interval">MYSQLI_TYPE_INTERVAL</a></code></strong> não utilizada, que atualmente
   é um esboço e um apelido para <strong><code><a href="mysqli.constants.php#constant.mysqli-type-enum">MYSQLI_TYPE_ENUM</a></code></strong>,
   foi removida.
   
  </p>
 </div>

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

  <p class="simpara">
   O código de erro relatado para os tempos limite de espera do servidor MySQL foi alterado de
   <code class="literal">2006</code> para <code class="literal">4031</code> nas versões 8.0.24
   e superiores do servidor MySQL.
  </p>
 </div>

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

  <p class="simpara">
   O valor máximo da configuração
   <a href="opcache.configuration.php#ini.opcache.interned-strings-buffer" class="link">opcache.interned_strings_buffer</a>
   em arquiteturas de 64 bits agora é <code class="literal">32767</code>.
   Anteriormente era <code class="literal">4095</code>.
  </p>

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

   <p class="simpara">
    Os valores de configuração padrão para o JIT foram alterados de
    <a href="opcache.configuration.php#ini.opcache.jit" class="link"><code class="literal">opcache.jit=tracing</code></a>
    e <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link"><code class="literal">opcache.jit_buffer_size=0</code></a>
    para <a href="opcache.configuration.php#ini.opcache.jit" class="link"><code class="literal">opcache.jit=disable</code></a>
    e <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link"><code class="literal">opcache.jit_buffer_size=64M</code></a>, respectivamente.
   </p>

   <p class="simpara">
    Isso não afeta o comportamento observável padrão,
    pois o JIT ainda está desabilitado por padrão.
    No entanto, agora ele está desativado por meio da configuração
    <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a>,
    em vez de
    <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link">opcache.jit_buffer_size</a>.
    Isso pode afetar usuários que anteriormente ativaram o JIT exclusivamente por meio de
    <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link">opcache.jit_buffer_size</a>,
    sem também especificar um modo JIT usando
    <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a>.
    Para ativar a compilação JIT, defina o
    valor de configuração <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a> adequadamente.
   </p>

   <p class="simpara">
    Se a compilação <abbr>JIT</abbr> estiver habilitada, o <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> irá agora sair com um erro fatal na
    inicialização se a inicialização do compilador <abbr>JIT</abbr> falhar por qualquer motivo.
   </p>
  </div>
 </div>

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

  <p class="simpara">
   As funções <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> e
   <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> agora sempre
   retornam <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> em caso de falha.
   Em alguns casos anteriores poderia retornar o valor <code class="literal">-1</code>.
  </p>
 </div>

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

  <p class="simpara">
   O pacote pcre2lib foi atualizado para a versão 10.44.
   Como consequência, isso significa que <code class="literal">{,3}</code> agora é reconhecido
   como um quantificador em vez de texto.
   Além disso, o significado de algumas classes de caracteres no modo UCP mudou.
   Consulte o <a href="https://github.com/PCRE2Project/pcre2/blob/master/NEWS" class="link external">&raquo;&nbsp;Registro de alterações do PCRE2</a>
   para um registro de alterações completo.
  </p>
 </div>

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

  <p class="simpara">
   Os atributos <strong><code><a href="class.pdo-dblib.php#pdo-dblib.constants.attr-stringify-uniqueidentifier">Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER</a></code></strong> e
   <strong><code><a href="class.pdo-dblib.php#pdo-dblib.constants.attr-datetime-convert">Pdo\Dblib::ATTR_DATETIME_CONVERT</a></code></strong> agora atuam como
   atributos booleanos em vez de atributos inteiros.
   Assim, definir o atributo via <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   e recuperá-lo via <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> espera
   e/ou retorna um <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">
   O atributo <strong><code><a href="pdo.constants.php#pdo.constants.attr-autocommit">PDO::ATTR_AUTOCOMMIT</a></code></strong> agora atua como
   atributos booleanos em vez de atributos inteiros.
   Assim, definir o atributo via <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   e recuperá-lo via <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> espera
   e/ou retorna um <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
  </p>

  <p class="simpara">
   A extensão agora expõe algumas APIs Firebird C++,
   portanto construir esta extensão agora requer um compilador C++.
   Além disso, a extensão agora deve ser compilada com fbclient 3.0 ou superior.
  </p>
 </div>

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

  <p class="simpara">
   Os atributos <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> e
   <strong><code><a href="ref.pdo-mysql.php#pdo.constants.mysql-attr-direct-query">PDO::MYSQL_ATTR_DIRECT_QUERY</a></code></strong> agora atuam como
   atributos booleanos em vez de atributos inteiros.
   Assim, definir o atributo via <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   e recuperá-lo via <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> espera
   e/ou retorna um <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">
   As credenciais do DSN, quando definidas, têm prioridade sobre as
   contrapartes do construtor PDO, estando mais próximas dos estados da documentação.
  </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ão é apenas uma representação de um
   elemento XML, mas também é um <span class="classname"><a href="class.recursiveiterator.php" class="classname">RecursiveIterator</a></span>.
   Antes do PHP 8.4.0, alguns de seus métodos (por exemplo,
   <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>) e a conversão de tais
   instâncias para <span class="type"><a href="language.types.string.php" class="type string">string</a></span> redefiniria implicitamente o iterador.
  </p>
  <p class="para">
   Isso poderia causar repetições infinitas inesperadas à medida que o iterador fosse retrocedido para o início.
   Por exemplo:
   <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">
     resultaria em uma repetição infinita.
    </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">
     No entanto, esse comportamento foi corrigido e um
     <span class="classname"><a href="class.simplexmlelement.php" class="classname">SimpleXMLElement</a></span> não redefinirá mais implicitamente
     os dados do iterador, a menos que seja retrocedido explicitamente.
     O que significa que o exemplo anterior agora resultaria em:
    </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> agora é um <span class="type"><a href="language.types.array.php" class="type array">array</a></span>
   em vez de um <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
   Verificações usando <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (ou seja,
   <code class="code">is_resource($client-&gt;typemap)</code>) devem ser
   substituídas por verificações de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (ou seja, <code class="code">$client-&gt;typemap !== null</code>).
  </p>

  <p class="simpara">
   A extensão SOAP ganhou uma dependência opcional da extensão
   <a href="book.session.php" class="link">session</a>.
   Se o PHP for compilado sem a extensão &quot;session&quot; e com o
   sinalizador de configuração <strong class="option unknown">--enable-rtld-now</strong> ativado,
   erros de inicialização ocorrerão agora se a extensão <a href="book.soap.php" class="link">SOAP</a>
   também for usada.
   Para resolver isso, não use rtld-now nem carregue a extensão &quot;session&quot;.
  </p>
 </div>

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

  <p class="simpara">
   Ao usar <span class="function"><a href="function.strcspn.php" class="function">strcspn()</a></span> com
   <code class="parameter">characters</code> sendo uma string vazia,
   o comprimento da string agora é retornado em vez de parar incorretamente
   no primeiro byte nulo.
   
  </p>

  <p class="simpara">
   <span class="function"><a href="function.http-build-query.php" class="function">http_build_query()</a></span> agora lida corretamente com enumerações apoiadas.
  </p>

  
  <p class="simpara">
   <span class="function"><a href="function.stream-bucket-make-writeable.php" class="function">stream_bucket_make_writeable()</a></span> e
   <span class="function"><a href="function.stream-bucket-new.php" class="function">stream_bucket_new()</a></span> agora irão retornar uma
   instância de <span class="classname"><strong class="classname">StreamBucket</strong></span> ao invés de uma instância 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">
   Falhas no construtor agora lançam exceções em vez de emitir
   alertas e ter um objeto quebrado.
  </p>
 </div>

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

  <p class="simpara">
   As funções <span class="function">xml_set_<span class="replaceable">*</span>_handler</span>
   agora declaram e verificam uma assinatura
   efetiva 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> para os
   parâmetros <code class="parameter">handler</code>.
   Além disso, os valores do tipo <span class="type"><a href="language.types.string.php" class="type string">string</a></span> que correspondem aos nomes dos métodos
   do objeto definido com <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> agora são verificados para
   ver se o método existe na classe do objeto passado anteriormente.
   Isso significa que <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> agora sempre deve ser
   chamada antes de definir nomes de métodos como <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>s.
   Passar uma string vazia para desabilitar o manipulador ainda é permitido,
   mas foi descontinuado.
  </p>

  <p class="simpara">
   No entanto, como <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> e a passagem
   de strings não <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>s foram descontinuadas,
   é recomendado alterar tais instâncias com um <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>
   referindo-se diretamente ao método.
  </p>
 </div>

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