<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'migration74.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 => 'migration74.php',
    1 => 'Migrando do PHP 7.3.x para o PHP 7.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration74.constants.php',
    1 => 'Novas Constantes Globais',
  ),
  'next' => 
  array (
    0 => 'migration74.deprecated.php',
    1 => 'Recursos descontinuados',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    '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">Alterações incompatíveis com versões anteriores</h2>

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

  <div class="sect3" id="migration74.incompatible.core.non-array-access">
   <h4 class="title">Acesso em estilo de array em não-array</h4>

   <p class="para">
    Tentar usar valores do tipo <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> como um
    array (como <code class="literal">$null[&quot;key&quot;]</code>) agora irá gerar um aviso.
   </p>
  </div>

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

   <p class="para">
    A função <span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span> não retorna mais
    classes anônimas que ainda não foram instanciadas.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fn">
   <h4 class="title">Palavra-chave <code class="literal">fn</code></h4>

   <p class="para">
    <code class="literal">fn</code> agora é uma palavra-chave reservada. Em particular,
    ele não pode mais ser usado como um nome de função ou classe.
    Ela ainda pode ser usado como um nome constante de método ou classe.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.php-tag">
   <h4 class="title">A tag <code class="literal">&lt;?php</code> no final do arquivo</h4>

   <p class="para">
    <code class="literal">&lt;?php</code> no final do arquivo (sem seguir a nova linha)
    agora será interpretado como uma tag PHP de abertura. Antes, era interpretada
    como uma short open tag seguida por um literal <code class="literal">php</code> e
    resultava em um erro de sintaxe (com <code class="literal">short_open_tag=1</code>)
    ou era interpretada como uma string literal <code class="literal">&lt;?php</code>
    (com <code class="literal">short_open_tag=0</code>).
   </p>
  </div>

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

   <p class="para">
    Ao usar include/require em um fluxo,
    <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span>
    será chamado com a opção <strong><code><a href="stream.constants.php#constant.stream-option-read-buffer">STREAM_OPTION_READ_BUFFER</a></code></strong>.
    As implementações personalizadas do empacotador de fluxo podem precisar implementar
    o método <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span>
    para evitar um aviso (sempre retornando <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> é uma implementação suficiente).
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.serialization">
   <h4 class="title">Serialização</h4>

   <p class="para">
    O formato <code class="literal">o</code> de serialização foi removido.
    Como nunca é produzido pelo PHP, isso pode apenas interromper a desserialização de
    strings criadas manualmente.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.password-algorithm-constants">
   <h4 class="title">Constantes do algoritmo de senha</h4>

   <p class="para">
    Os identificadores do algoritmo de hash de senha agora são sequências anuláveis
    ​​em vez de números inteiros.
   </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> era um int 1; agora é uma string &#039;2y&#039; (no PHP 7.4.0, 7.4.1 e 7.4.2 era <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> era um int 1; agora é uma string &#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> era um int 2; agora é uma string &#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> era um int 3; agora é uma string &#039;argon2id&#039;
     </span>
    </li>
   </ul>

   <p class="para">
    Aplicações que usam corretamente as constantes PASSWORD_DEFAULT,
    PASSWORD_BCRYPT, PASSWORD_ARGON2I e PASSWORD_ARGON2ID continuarão
    funcionando corretamente.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.htmlentities">
   <h4 class="title">Função <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> agora emitirá um aviso
    (em vez de um aviso estrito sobre os padrões) se for usado com
    uma codificação para a qual apenas a substituição básica de entidade é suportada;
    nesse caso, é equivalente a<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">Funções <span class="function"><a href="function.fread.php" class="function">fread()</a></span> e <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> e <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span> agora retornarão
    <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> se a operação falhar.
    Antes uma string vazia ou 0 era retornado.
    EAGAIN/EWOULDBLOCK não são considerados falhas.
   </p>
   <p class="para">
    Essas funções agora também emitem um aviso de falha,
    como ao tentar gravar em um recurso de arquivo somente leitura.
   </p>
  </div>

 </div>

 <div class="sect2" id="migration74.incompatible.bcmath">
  <h3 class="title">Funções matemáticas de precisão arbitrária BCMath</h3>

  <p class="para">
   As funções BCMath agora avisam se um número não bem formado é passado, como
   <code class="literal">&quot;32foo&quot;</code>. O argumento será interpretado como zero, como antes.
  </p>
 </div>

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

  <p class="para">
   Tentar serializar uma classe <span class="classname"><a href="class.curlfile.php" class="classname">CURLFile</a></span> agora irá
   gerar uma exceção. Antes, a exceção era lançada apenas na desserialização.
  </p>
  <p class="para">
   O uso de <strong><code><a href="curl.constants.php#constant.curlpipe-http1">CURLPIPE_HTTP1</a></code></strong> está descontinuado, e não é mais
   suportado a partir do cURL 7.62.0.
  </p>
  <p class="para">
   O parâmetro <code class="literal">$version</code> de <span class="function"><a href="function.curl-version.php" class="function">curl_version()</a></span>
   está descontinuado. Se qualquer valor diferente do padrão <strong><code><a href="curl.constants.php#constant.curlversion-now">CURLVERSION_NOW</a></code></strong>
   for passado, um aviso será gerado e o parâmetro será ignorado.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.datetime">
  <h3 class="title">Data e hora</h3>

  <p class="para">
   Chamar a função <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> ou similar em uma instância de
   <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>
   não deixará mais propriedades acessíveis no objeto.
  </p>
  <p class="para">
   A comparação de objetos <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span>
   (usando <code class="literal">==</code>, <code class="literal">&lt;</code>, e assim por diante) agora gera um aviso
   e sempre retorna <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>. Antes todos os objetos <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span>
   eram considerados iguais, a menos que tivessem propriedades.
  </p>
 </div>

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

  <p class="para">
   O valor padrão do parâmetro das funções <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> e
   <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span> agora é <strong><code><a href="intl.constants.php#constant.intl-idna-variant-uts46">INTL_IDNA_VARIANT_UTS46</a></code></strong>
   em vez do descontinuado <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">
   A funcionalidade do servidor incorporado foi removida. Foi quebrado desde
   pelo menos o PHP 7.0.
  </p>
  <p class="para">
   A propriedade não documentada <code class="literal">mysqli::$stat</code> foi removida
   em favor 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">
   A função <span class="function"><a href="function.openssl-random-pseudo-bytes.php" class="function">openssl_random_pseudo_bytes()</a></span> agora
   lançará uma exceção em situações de erro, semelhante a <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span>.
   Em particular, um <span class="classname"><a href="class.error.php" class="classname">Error</a></span> será lançado se o número de
   bytes solicitados for menor ou igual a zero, e uma <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>
   será lançada se não for possível reunir aleatoriedade suficiente.
   É garantido que o argumento de saída <code class="literal">$crypto_strong</code> será sempre
   <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> se a função não lançar exceção, portanto, uma verificação explícita não é necessário.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.pcre">
  <h3 class="title">Expressões regulares (Compatíveis com Perl)</h3>

  <p class="para">
   Quando o modo <strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong> é usado,
   os grupos de captura sem correspondência à direita agora também serão definidos como <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (ou
   <code class="literal">[null, -1]</code> se a captura deslocada estiver habilitada).
   Isso significa que o tamanho de <code class="literal">$matches</code> sempre será o mesmo.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.pdo">
  <h3 class="title">Objetos de dados PHP</h3>

  <p class="para">
   A tentativa de serializar uma instância <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> agora gerará
   uma <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> em vez de uma <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span>,
   consistente com outras classes internas que não oferecem suporte à serialização.
  </p>
 </div>

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

  <p class="para">
   Os objetos reflexion agora gerarão uma exceção se for feita
   uma tentativa de serializá-los. A serialização de objetos reflexion nunca
   foi suportada e resultou em objetos reflexions corrompidos. Foi explicitamente
   proibido agora.
  </p>

  <p class="para">
   Os valores para as constantes das classes <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> e <span class="classname"><a href="class.reflectionproperty.php" class="classname">ReflectionProperty</a></span>
   mudaram.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.spl">
  <h3 class="title">Biblioteca Padrão PHP (SPL)</h3>

  <p class="para">
   Chamar <span class="function"><a href="function.get-object-vars.php" class="function">get_object_vars()</a></span> em uma instância de <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>
   agora sempre retornará as propriedades do próprio <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>
   (ou de uma sub classe). Antes, ele retornava os valores do
   array/object a menos que a flag <strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong>
   fosse especificado.
  </p>
  <p class="para">
   Outras operações afetadas são:
  </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.
     Use os métodos de <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span> em seu lugar.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Potencialmente outros trabalhando nas propriedades do objeto como uma lista,
     por exemplo <span class="function"><a href="function.array-walk.php" class="function">array_walk()</a></span>.
    </span>
   </li>
  </ul>
  <p class="para">
   <code class="literal">(array)</code> casts não são afetadas. Eles continuarão
   retornando o array agrupado, ou as propriedades <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>
   dependendo se a flag <strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong>
   é usada.
  </p>
  <p class="para">
   <span class="methodname"><a href="splpriorityqueue.setextractflags.php" class="methodname">SplPriorityQueue::setExtractFlags()</a></span> lançará uma exceção
   se zero for passado. Antes, isso geraria um erro fatal recuperável
   na próxima operação de extração.
  </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> e <span class="classname"><a href="class.splobjectstorage.php" class="classname">SplObjectStorage</a></span>
   agora oferecem suporte ao mecanismo <code class="literal">__serialize()</code> e <code class="literal">__unserialize()</code>
   além da interface <span class="interfacename"><a href="class.serializable.php" class="interfacename">Serializable</a></span>.
   Isso significa que as payloads de serialização criadas em versões mais antigas do PHP ainda podem ser
   desserializadas, mas as novas payloads criadas pelo PHP 7.4 não serão entendidas pelas versões mais antigas.
  </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> agora emitirá um
   token <strong><code><a href="tokens.php#constant.t-bad-character">T_BAD_CHARACTER</a></code></strong> para caracteres
   inesperados em vez de deixar para trás buracos no fluxo de token.
  </p>
 </div>

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

  <p class="para">
   A partir do PHP 7.4.11, os <em>nomes</em> dos cookies recebidos não
    são mais decodificados em url por razões de segurança.
  </p>
 </div>

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