Files
archived-doc-pt-br/appendices/migration81/new-features.xml
Leonardo Lara Rodrigues 0daf9218ca fix and improve translation
2025-06-04 10:43:47 -03:00

492 lines
15 KiB
XML

<?xml version="1.0" encoding="utf-8"?><!-- EN-Revision: 161dde4fe721309398dd324edbf02aec409f127b Maintainer: leonardolara Status: ready --><!-- CREDITS: ABDALAZARD,lhsazevedo,ae,dtgfranca,leonardolara -->
<sect1 xml:id="migration81.new-features" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Novas Funcionalidades</title>
<sect2 xml:id="migration81.new-features.core">
<title>Núcleo do PHP</title>
<sect3 xml:id="migration81.new-features.core.octal-literal-prefix">
<title>Prefixo de Inteiro Literal Octal</title>
<para>
Inteiros octais agora podem usar um prefixo
<literal>0o</literal>/<literal>0O</literal>
explícito em inteiros literais,
similar à inteiros literais binários e hexadecimais.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
014; // Literal octal não-prefixado
0o14; // Literal octal prefixado
?>
]]>
</programlisting>
</informalexample>
</para>
<!-- RFC: https://wiki.php.net/rfc/explicit_octal_notation -->
</sect3>
<sect3 xml:id="migration81.new-features.core.unpacking-string-keys">
<title>Desempacotamento de Array com chaves String</title>
<para>
Adicionado suporte para <link linkend="language.types.array.unpacking">desmontagem de arrays com chave string</link>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$arr1 = [1, 'a' => 'b'];
$arr2 = [...$arr1, 'c' => 'd']; //[1, 'a' => 'b', 'c' => 'd']
?>
]]>
</programlisting>
</informalexample>
</para>
<!-- RFC: https://wiki.php.net/rfc/array_unpacking_string_keys -->
</sect3>
<sect3 xml:id="migration81.new-features.core.named-arg-after-unpack">
<title>Argumentos Nomeados Após Desempacotamento de Argumentos</title>
<para>
Agora é possível especificar argumentos nomeados após um desempacotamento de argumentos.
<!-- TODO Add an example -->
ex.
foo(...$args, nomeado: $arg).
</para>
</sect3>
<sect3 xml:id="migration81.new-features.core.upload-full-path-key">
<title>Chave do Caminho Completo para Upload de Arquivos</title>
<para>
Upload de arquivos agora fornece uma chave adicional <literal>full_path</literal>,
que contém o caminho completo (em vez de apenas o nome base) do arquivo carregado.
Isso destina-se ao uso em conjunto com "upload webkitdirectory".
</para>
<!-- RFC: https://wiki.php.net/rfc/array_unpacking_string_keys -->
</sect3>
<sect3 xml:id="migration81.new-features.core.enums">
<title>Enumerações</title>
<para>
Suporte para <link linkend="language.enumerations">Enumerações</link> foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/enumerations -->
</para>
</sect3>
<sect3 xml:id="migration81.new-features.core.fibers">
<title>Fibers</title>
<para>
Suporte para <link linkend="language.fibers">Fibers</link> foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/fibers -->
</para>
</sect3>
<sect3 xml:id="migration81.new-features.core.callable-syntax">
<title>Sintaxe de Chamáveis de Primeira Classe</title>
<para>
Closures para chamáveis agora podem ser criadas usando <link linkend="functions.first_class_callable_syntax">a sintaxe <code>myFunc(...)</code></link>,
que é idêntica a <code>Closure::fromCallable('myFunc')</code>.
<!-- RFC: https://wiki.php.net/rfc/first_class_callable_syntax -->
</para>
<note>
<simpara>
O <code>...</code> é parte da sintaxe, e não uma omissão.
</simpara>
</note>
</sect3>
<sect3 xml:id="migration81.new-features.core.intersection-types">
<title>Tipos de Intersecção</title>
<para>
Suporte a <link linkend="language.types.type-system.composite.intersection">tipos de intersecção</link> foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/pure-intersection-types -->
</para>
<caution>
<simpara>
<link linkend="language.types.type-system.composite.intersection">Tipos de
Intersecção</link> não podem ser usados em conjunto com
<link linkend="language.types.declarations.composite.union">tipos de
união</link>
</simpara>
</caution>
</sect3>
<sect3 xml:id="migration81.new-features.core.never-type">
<title>Tipo never</title>
<para>
Um novo tipo &never; de retorno apenas foi adicionado.
Isso indica que a função <function>exit</function>,
lança uma exceção, ou não termina.
<!-- RFC: https://wiki.php.net/rfc/noreturn_type -->
</para>
</sect3>
<sect3 xml:id="migration81.new-features.core.new-in-initializer">
<title>&new; em Inicializadores</title>
<para>
Agora é possível usar expressões <code>new ClassName()</code> como o
valor padrão de um parâmetro, variável estática, inicializadores de constante global,
e como argumentos de atributo.
Objetos também podem ser passados para <function>define</function> agora.
<!-- TODO Add an example -->
</para>
<!-- RFC: https://wiki.php.net/rfc/new_in_initializers -->
</sect3>
<sect3 xml:id="migration81.new-features.core.readonly">
<title>Propriedades somente leitura</title>
<para>
Suporte para propriedades <link linkend="language.oop5.properties.readonly-properties">readonly</link> foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/readonly_properties_v2 -->
</para>
</sect3>
<sect3 xml:id="migration81.new-features.core.final-constants">
<title>Constantes de classe finais</title>
<para>
Adicionado suporte ao <link linkend="language.oop5.final.example.php81">modificador <modifier>final</modifier> para constantes de classe.</link>
Além disso, as constantes de interface podem ser sobreescritas.
<!-- RFC: https://wiki.php.net/rfc/final_class_const -->
</para>
</sect3>
</sect2>
<sect2 xml:id="migration81.new-features.curl">
<title>CURL</title>
<para>
Adicionada a opção <constant>CURLOPT_DOH_URL</constant>.
</para>
<para>
Adicionadas opções para certificado blob quando libcurl &gt;= 7.71.0:
</para>
<itemizedlist>
<listitem>
<simpara><constant>CURLOPT_ISSUERCERT_BLOB</constant></simpara>
</listitem>
<listitem>
<simpara><constant>CURLOPT_PROXY_ISSUERCERT</constant></simpara>
</listitem>
<listitem>
<simpara><constant>CURLOPT_PROXY_ISSUERCERT_BLOB</constant></simpara>
</listitem>
<listitem>
<simpara><constant>CURLOPT_PROXY_SSLCERT_BLOB</constant></simpara>
</listitem>
<listitem>
<simpara><constant>CURLOPT_PROXY_SSLKEY_BLOB</constant></simpara>
</listitem>
<listitem>
<simpara><constant>CURLOPT_SSLCERT_BLOB</constant></simpara>
</listitem>
<listitem>
<simpara><constant>CURLOPT_SSLKEY_BLOB</constant></simpara>
</listitem>
</itemizedlist>
<para>
Adicionada <classname>CURLStringFile</classname>, que pode ser usada para postar
um arquivo a partir de uma &string; em vez de um arquivo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$file = new CURLStringFile($data, 'filename.txt', 'text/plain');
curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => $file]);
?>
]]>
</programlisting>
</informalexample>
</para>
</sect2>
<sect2 xml:id="migration81.new-features.fpm">
<title>FPM</title>
<para>
Adicionado status de formato openmetrics. Ele pode ser usado pelo Prometheus para buscar métricas
do FPM.
</para>
<para>
Adicionada nova opção de pool para o gerenciador de processo dinâmico chamada
<literal>pm.max_spawn_rate</literal>. Ela permite iniciar uma séria de filhos
em um ritmo mais rápido quando pm dinâmico está selecionado.
O valor padrão é <literal>32</literal> que era o valor
codificado anterior.
</para>
</sect2>
<sect2 xml:id="migration81.new-features.gd">
<title>GD</title>
<para>
Suporte Avif agora está disponível através de
<function>imagecreatefromavif</function> e
<function>imageavif</function>,
se a libgd foi compilada com suporte Avif.
</para>
</sect2>
<sect2 xml:id="migration81.new-features.hash">
<title>Hash</title>
<para>
As seguintes funções <function>hash</function>,
<function>hash_file</function>, e <function>hash_init</function>
agora suportam um argumento opcional <parameter>options</parameter>
adicional, que pode ser utilizado para passar dados específicos do algoritmo.
</para>
<sect3 xml:id="migration81.new-features.hash.murmurhash3">
<title>MurmurHash3</title>
<para>
Adicionado suporte a <literal>MurmurHash3</literal> com suporte
a fluxos. As seguintes variantes estão implementadas:
</para>
<itemizedlist>
<listitem>
<simpara>murmur3a, hash 32-bit</simpara>
</listitem>
<listitem>
<simpara>murmur3c, hash 128-bit para x86</simpara>
</listitem>
<listitem>
<simpara>murmur3f, hash 128-bit para x64</simpara>
</listitem>
</itemizedlist>
<para>
O estado de hash inicial pode ser passado através da chave <literal>seed</literal>
no array <parameter>options</parameter>, por exemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$h = hash("murmur3f", $data, options: ["seed" => 42]);
echo $h, "\n";
?>
]]>
</programlisting>
</informalexample>
Um valor semente válido está no intervalo de <literal>0</literal>
até o <constant>UINT_MAX</constant> definido pela plataforma, geralmente
<literal>4294967295</literal>.
</para>
</sect3>
<sect3 xml:id="migration81.new-features.hash.xxhash">
<title>xxHash</title>
<para>
Adicionado suporte a <literal>xxHash</literal>.
As seguintes variantes estão implementadas:
</para>
<itemizedlist>
<listitem>
<simpara>xxh32, hash 32-bit</simpara>
</listitem>
<listitem>
<simpara>xxh64, hash 64-bit</simpara>
</listitem>
<listitem>
<simpara>xxh3, hash 64-bit</simpara>
</listitem>
<listitem>
<simpara>xxh128, hash 128-bit</simpara>
</listitem>
</itemizedlist>
<para>
O estado inicial de hash pode ser passado através da chave <literal>seed</literal>
no array <parameter>options</parameter>, por exemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$h = hash("xxh3", $data, options: ["seed" => 42]);
echo $h, "\n";
?>
]]>
</programlisting>
</informalexample>
O uso de segredo é suportado através da passagem do chave <literal>secret</literal>
no array <parameter>options</parameter>, também:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$h = hash("xxh3", $data, options: ["secret" => "Segredo de pelo menos 136 bytes aqui"]);
echo $h, "\n";
?>
]]>
</programlisting>
</informalexample>
A qualidade do segredo personalizado é crucial para a qualidade do hash resultante.
É altamente recomendado usar a melhor entropia possível para o segredo.
</para>
</sect3>
</sect2>
<sect2 xml:id="migration81.new-features.mysqli">
<title>MySQLi</title>
<sect3 xml:id="migration81.new-features.mysqli.local_infile_directory">
<title>Nova diretiva INI <literal>mysqli.local_infile_directory</literal></title>
<para>
A diretiva INI <link linkend="ini.mysqli.local-infile-directory">mysqli.local_infile_directory</link>
foi adicionada, que pode ser usada para especificar um diretório a partir
do qual os arquivos podem ser carregados. Só é significativo se
<link linkend="ini.mysqli.allow-local-infile">mysqli.allow_local_infile</link>
não estiver habilitada, já que todos os diretórios são permitidos nesse caso.
</para>
</sect3>
<sect3 xml:id="migration81.new-features.mysqli.bind-in-execute">
<title>Ligar parâmetros no execute</title>
<para>
Agora é possível ligar parâmetros passando-os como um array para o
<methodname>mysqli_stmt::execute</methodname>. Todos os valores serão ligados como
strings. Apenas arrays de lista são permitidos. Essa nova funcionalidade não está disponível
quando MySQLi é compilado com libmysqlclient.
<!-- RFC: https://wiki.php.net/rfc/mysqli_bind_in_execute -->
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$stmt = $mysqli->prepare('INSERT INTO users(id, name) VALUES(?,?)');
$stmt->execute([1, $username]);
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
<sect3 xml:id="migration81.new-features.mysqli.mysqli_fetch_column">
<title>Novo método <methodname>mysqli_result::fetch_column</methodname></title>
<para>
<methodname>mysqli_result::fetch_column</methodname>
foi adicionado para permitir buscar um único valor escalar do conjunto de resultados.
O novo método aceita um parâmetro opcional baseado em 0 <parameter>column</parameter>
do tipo &integer; especificando de qual coluna buscar.
<!-- RFC: https://wiki.php.net/rfc/mysqli_fetch_column -->
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$result = $mysqli->query('SELECT username FROM users WHERE id = 123');
echo $result->fetch_column();
?>
]]>
</programlisting>
</informalexample>
</para>
</sect3>
</sect2>
<sect2 xml:id="migration81.new-features.pdo_mysql">
<title>PDO</title>
<para>
O atributo <constant>PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY</constant>
foi adicionado, que pode ser usado para especificar um diretório no qual os
arquivos podem ser carregados.
É significante apenas se <constant>PDO::MYSQL_ATTR_LOCAL_INFILE</constant>
não estiver habilitada, já que todos os diretórios são permitidos nesse caso.
</para>
</sect2>
<sect2 xml:id="migration81.new-features.pdo_sqlite">
<title>PDO_SQLite</title>
<para>
A sintaxe DSN <literal>"file:"</literal> do SQLite agora é suportada,
que permite especificar flags adicionais.
Essa funcionalidade não está disponível se open_basedir estiver definido.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
new PDO('sqlite:file:caminho/para/sqlite.db?mode=ro')
?>
]]>
</programlisting>
</informalexample>
</para>
</sect2>
<sect2 xml:id="migration81.new-features.posix">
<title>POSIX</title>
<para>
Adicionadas as contantes <constant>POSIX_RLIMIT_KQUEUES</constant> e <constant>POSIX_RLIMIT_NPTS</constant>.
Esses "rlimits" estão disponíveis apenas no FreeBSD.
</para>
</sect2>
<sect2 xml:id="migration81.new-features.standard">
<title>Standard</title>
<para>
<function>fputcsv</function> agora aceita um novo argumento
<parameter>eol</parameter> que permite a definição de uma sequência de
fim de linha personalizada, o padrão continua o mesmo e é <literal>"\n"</literal>.
</para>
</sect2>
<sect2 xml:id="migration81.new-features.spl">
<title>SPL</title>
<para>
<methodname>SplFileObject::fputcsv</methodname> agora aceita um novo argumento
<parameter>eol</parameter> que permite a definição de uma sequência de
fim de linha personalizada, o padrão continua o mesmo e é <literal>"\n"</literal>.
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->