<?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.new-features.php',
    1 => 'Novos Recursos',
    2 => 'Novos Recursos',
  ),
  'up' => 
  array (
    0 => 'migration74.php',
    1 => 'Migrando do PHP 7.3.x para o PHP 7.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration74.php',
    1 => 'Migrando do PHP 7.3.x para o PHP 7.4.x',
  ),
  'next' => 
  array (
    0 => 'migration74.new-classes.php',
    1 => 'Novas Classes e Interfaces',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'appendices/migration74/new-features.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration74.new-features" class="sect1">
 <h2 class="title">Novos Recursos</h2>

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

  <div class="sect3" id="migration74.new-features.core.typed-properties">
   <h4 class="title">Propriedades tipadas</h4>

   <p class="para">
    As propriedades de classe agora suportam declarações de tipo.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">User </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">int $id</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    O exemplo acima reforçará que <code class="literal">$user-&gt;id</code> pode ser atribuído apenas
    com valores <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> e <code class="literal">$user-&gt;name</code>
    somente com valores de <span class="type"><a href="language.types.string.php" class="type string">string</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.arrow-functions">
   <h4 class="title">Funções de Seta</h4>

   <p class="para">
    <a href="functions.arrow.php" class="link">Funções de seta</a> fornecem uma
    sintaxe abreviada para definir funções
    com ligação implícita por valor de escopo.

    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$factor </span><span style="color: #007700">= </span><span style="color: #0000BB">10</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$nums </span><span style="color: #007700">= </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(fn(</span><span style="color: #0000BB">$n</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">$n </span><span style="color: #007700">* </span><span style="color: #0000BB">$factor</span><span style="color: #007700">, [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">]);<br /></span><span style="color: #FF8000">// $nums = array(10, 20, 30, 40);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.type-variance">
   <h4 class="title">Covariância do tipo de retorno limitado e contravariância do tipo de argumento</h4>

   <p class="para">
    O código a seguir agora funcionará:
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A </span><span style="color: #007700">{}<br /><br />class </span><span style="color: #0000BB">Producer </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(): </span><span style="color: #0000BB">A </span><span style="color: #007700">{}<br />}<br />class </span><span style="color: #0000BB">ChildProducer </span><span style="color: #007700">extends </span><span style="color: #0000BB">Producer </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(): </span><span style="color: #0000BB">B </span><span style="color: #007700">{}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    O suporte completo à variação só está disponível se o carregamento automático for usado. Dentro de
    um único arquivo, apenas as referências de tipo não cíclico são possíveis, porque todas
    as classes precisam estar disponíveis antes de serem referenciadas.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/**<br /> * Essas classes satisfazem os requisitos do LSP, porque C é um subtipo de A.<br /> * No entanto, no momento em que a classe B é declarada, a classe C ainda não está disponível<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(): </span><span style="color: #0000BB">A </span><span style="color: #007700">{}<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Erro fatal: Não foi possível verificar a compatibilidade entre B::method():C e<br />    // A::method(): A, porque a classe C não está disponível<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(): </span><span style="color: #0000BB">C </span><span style="color: #007700">{}<br />}<br /><br />class </span><span style="color: #0000BB">C </span><span style="color: #007700">extends </span><span style="color: #0000BB">B </span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.null-coalescing-assignment-operator">
   <h4 class="title">Operador de atribuição de coalescência nula</h4>

   <p class="para">
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array</span><span style="color: #007700">[</span><span style="color: #DD0000">'key'</span><span style="color: #007700">] ??= </span><span style="color: #0000BB">computeDefault</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">// é praticamente equivalente a<br /></span><span style="color: #007700">if (!isset(</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">'key'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">'key'</span><span style="color: #007700">] = </span><span style="color: #0000BB">computeDefault</span><span style="color: #007700">();<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.unpack-inside-array">
   <h4 class="title">Descompactando dentro de arrays</h4>

   <p class="para">
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$parts </span><span style="color: #007700">= [</span><span style="color: #DD0000">'apple'</span><span style="color: #007700">, </span><span style="color: #DD0000">'pear'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$fruits </span><span style="color: #007700">= [</span><span style="color: #DD0000">'banana'</span><span style="color: #007700">, </span><span style="color: #DD0000">'orange'</span><span style="color: #007700">, ...</span><span style="color: #0000BB">$parts</span><span style="color: #007700">, </span><span style="color: #DD0000">'watermelon'</span><span style="color: #007700">];<br /></span><span style="color: #FF8000">// ['banana', 'orange', 'apple', 'pear', 'watermelon'];<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.numeric-literal-separator">
   <h4 class="title">Separador literal numérico</h4>

   <p class="para">
    Literais numéricos podem conter underscores entre dígitos.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />6.674_083e-11</span><span style="color: #007700">; </span><span style="color: #FF8000">// float<br /></span><span style="color: #0000BB">299_792_458</span><span style="color: #007700">;   </span><span style="color: #FF8000">// decimal<br /></span><span style="color: #0000BB">0xCAFE_F00D</span><span style="color: #007700">;   </span><span style="color: #FF8000">// hexadecimal<br /></span><span style="color: #0000BB">0b0101_1111</span><span style="color: #007700">;   </span><span style="color: #FF8000">// binário<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.weakreference">
   <h4 class="title">Referências fracas</h4>

   <p class="para">
    <a href="class.weakreference.php" class="link">Referências fracas</a> permitem que o programador mantenha uma referência a um objeto
    que não impede que o objeto seja destruído.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.core.tostring-exceptions">
   <h4 class="title">Permitir exceções de __toString()</h4>

   <p class="para">
    Lançar exceções de <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>
    agora é permitido. Antes isto resultava um erro fatal. Os erros fatais
    recuperáveis ​​existentes nas conversões de string foram convertidos
    em exceções de <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
   </p>
  </div>

 </div>

 <div class="sect2" id="migration74.new-features.curl">
  <h3 class="title">CURL</h3>

  <p class="para">
   <span class="classname"><a href="class.curlfile.php" class="classname">CURLFile</a></span> agora suporta empacotadores de fluxo,
   além de nomes de arquivos simples, se a extensão tiver sido criada com relação à libcurl &gt;= 7.56.0.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.filter">
  <h3 class="title">Filter</h3>

  <p class="para">
   O filtro <strong><code><a href="filter.constants.php#constant.filter-validate-float">FILTER_VALIDATE_FLOAT</a></code></strong> agora suporta
   as opções <code class="literal">min_range</code> e <code class="literal">max_range</code>
   com a mesma semântica que <strong><code><a href="filter.constants.php#constant.filter-validate-int">FILTER_VALIDATE_INT</a></code></strong>.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.ffi">
  <h3 class="title">FFI</h3>

  <p class="para">
   FFI é uma nova extensão, que fornece uma maneira simples de chamar
   funções nativas, acessar variáveis ​​nativas e criar/acessar
   estruturas de dados definidas nas bibliotecas C.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.gd">
  <h3 class="title">GD</h3>

  <p class="para">
   Adicionado o filtro de imagem <strong><code><a href="image.constants.php#constant.img-filter-scatter">IMG_FILTER_SCATTER</a></code></strong>
   para aplicar um filtro de dispersão às imagens.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.hash">
  <h3 class="title">Hash</h3>

  <p class="para">
   Adicionado o hash <code class="literal">crc32c</code> usando o polinômio de Castagnoli.
   Essa variante CRC32 é usada por sistemas de armazenamento, como
   iSCSI, SCTP, Btrfs e ext4.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.mbstring">
  <h3 class="title">Multibyte String</h3>

  <p class="para">
   Adicionada a função <span class="function"><a href="function.mb-str-split.php" class="function">mb_str_split()</a></span>, que fornece
   a mesma funcionalidade que <span class="function"><a href="function.str-split.php" class="function">str_split()</a></span>, mas operando
   em pontos de código em vez de bytes.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.opcache">
  <h3 class="title">OPcache</h3>

  <p class="para">
   <a href="opcache.preloading.php" class="link">Suporte para pré-carregamento de código</a> foi adicionado.
  </p>
 </div>

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

  <p class="para">
   As funções <span class="function"><a href="function.preg-replace-callback.php" class="function">preg_replace_callback()</a></span> e <span class="function"><a href="function.preg-replace-callback-array.php" class="function">preg_replace_callback_array()</a></span>
   agora aceitam um argumento <code class="parameter">flags</code> adicional, com suporte para as constantes
   <strong><code><a href="pcre.constants.php#constant.preg-offset-capture">PREG_OFFSET_CAPTURE</a></code></strong> e <strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong>.
   Isso influencia o formato do array de correspondências passado para a função de retorno da chamada.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.pdo">
  <h3 class="title">PDO</h3>

  <p class="para">
   O nome de usuário e a senha agora podem ser especificados como parte do PDO DSN para
   os drivers mysql, mssql, sybase, dblib, firebird e oci. Antes, isso
   era suportado apenas pelo driver pgsql. Se um nome de usuário/senha for especificado
   no construtor e no DSN, o construtor terá precedência.
  </p>
  <p class="para">
   Agora é possível escapar pontos de interrogação nas consultas SQL para evitar que
   elas sejam interpretadas como espaços reservados para parâmetros. Escrever <code class="literal">??</code>
   permite enviar um único ponto de interrogação para o banco de dados e por exemplo, usar o
   operador PostgreSQL JSON &#039;key exists&#039; (<code class="literal">?</code>).
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.pdo_oci">
  <h3 class="title">PDO_OCI</h3>

  <p class="para">
   <span class="methodname"><a href="pdostatement.getcolumnmeta.php" class="methodname">PDOStatement::getColumnMeta()</a></span> agora está disponível.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.pdo_sqlite">
  <h3 class="title">PDO_SQLite</h3>

  <p class="para">
   <code class="literal">PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)</code>
   permite verificar se a instrução é somente leitura, ou seja, se não modifica
   o banco de dados.
  </p>
  <p class="para">
   <code class="literal">PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)</code>
   permite o uso de códigos de resultado estendidos do SQLite3 em <span class="function"><a href="pdo.errorinfo.php" class="function">PDO::errorInfo()</a></span>
   e <span class="function"><a href="pdostatement.errorinfo.php" class="function">PDOStatement::errorInfo()</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.sqlite3">
  <h3 class="title">SQLite3</h3>

  <p class="para">
   Adicionado <span class="methodname"><strong>SQLite3::lastExtendedErrorCode()</strong></span>
   para buscar o último código de resultado estendido.
  </p>
  <p class="para">
   Adicionado <code class="literal">SQLite3::enableExtendedResultCodes($enable = true)</code>,
   que fará <span class="methodname"><a href="sqlite3.lasterrorcode.php" class="methodname">SQLite3::lastErrorCode()</a></span>
   retornar códigos de resultado estendidos.
  </p>
 </div>

 <div class="sect2" id="migration74.new-features.standard">
  <h3 class="title">Standard</h3>

  <div class="sect3" id="migration74.new-features.standard.strip-tags">
   <h4 class="title">strip_tags() com array de nomes de tags</h4>
   <p class="para">
    <span class="function"><a href="function.strip-tags.php" class="function">strip_tags()</a></span> agora também aceita um array de tags permitidas:
    em vez de <code class="literal">strip_tags($str, &#039;&lt;a&gt;&lt;p&gt;&#039;)</code>
    agora você pode escrever <code class="literal">strip_tags($str, [&#039;a&#039;, &#039;p&#039;])</code>.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.standard.magic-serialize">
   <h4 class="title"> Serialização de objetos personalizados</h4>
   <p class="para">
    Um novo mecanismo para serialização de objetos personalizados foi adicionado,
    que usa dois novos métodos mágicos: <code class="literal">__serialize</code>
    e <code class="literal">__unserialize</code>.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Retorna um array contendo todo o estado necessário do objeto.<br /></span><span style="color: #007700">public function </span><span style="color: #0000BB">__serialize</span><span style="color: #007700">(): array<br />{<br />}<br /><br /></span><span style="color: #FF8000">// Restaura o estado do objeto a partir do array de dados fornecido.<br /></span><span style="color: #007700">public function </span><span style="color: #0000BB">__unserialize</span><span style="color: #007700">(array </span><span style="color: #0000BB">$data</span><span style="color: #007700">): </span><span style="color: #0000BB">void<br /></span><span style="color: #007700">{<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    O novo mecanismo de serialização substitui a interface
    <span class="interfacename"><a href="class.serializable.php" class="interfacename">Serializable</a></span>,
    que será descontinuada no futuro.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.standard.array-merge-no-args">
   <h4 class="title">Funções de mesclagem de array sem argumentos</h4>
   <p class="para">
    <span class="function"><a href="function.array-merge.php" class="function">array_merge()</a></span> e <span class="function"><a href="function.array-merge-recursive.php" class="function">array_merge_recursive()</a></span>
    agora podem ser chamados sem nenhum argumento; nesse caso, eles retornarão um array vazio.
    Isso é útil em conjunto com o operador de espalhamento (spread operator), por exemplo, <code class="literal">array_merge(...$arrays)</code>.
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.standard.proc-open">
   <h4 class="title">Função <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span></h4>
   <p class="para">
    <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> agora aceita um array em vez de
    uma string para o comando. Nesse caso, o processo será aberto
    diretamente (sem passar por um shell) e o PHP cuidará de
    qualquer argumento necessário para escapar.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />proc_open</span><span style="color: #007700">([</span><span style="color: #DD0000">'php'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-r'</span><span style="color: #007700">, </span><span style="color: #DD0000">'echo "Hello World\n";'</span><span style="color: #007700">], </span><span style="color: #0000BB">$descriptors</span><span style="color: #007700">, </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <p class="para">
    <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> agora suporta
    <code class="literal">redirect</code> e descritores <code class="literal">null</code>.
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Similar a 2&gt;&amp;1 no shell<br /></span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$cmd</span><span style="color: #007700">, [</span><span style="color: #0000BB">1 </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'pipe'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">], </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'redirect'</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">]], </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Similar a 2&gt;/dev/null ou 2&gt;nul no shell<br /></span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$cmd</span><span style="color: #007700">, [</span><span style="color: #0000BB">1 </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'pipe'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">], </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'null'</span><span style="color: #007700">]], </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect3" id="migration74.new-features.standard.sodium-argon-hash">
   <h4 class="title">argon2i(d) sem libargon</h4>
   <p class="para">
    <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> agora possui as implementações argon2i e argon2id
    da extensão sodium quando o PHP é compilado sem libargon.
   </p>
  </div>

 </div>

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