Files
archived-doc-pt-br/appendices/migration80/new-features.xml
2025-08-27 14:12:36 -03:00

647 lines
21 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 497c40ac164d5873fd87f622dfdeb5206392b446 Maintainer: leonardolara Status: ready -->
<sect1 xml:id="migration80.new-features" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Novas Funcionalidades</title>
<sect2 xml:id="migration80.new-features.core">
<title>Núcleo do PHP</title>
<sect3 xml:id="migration80.new-features.core.named-arguments">
<title>Argumentos nomeados</title>
<para>
<!-- RFC: https://wiki.php.net/rfc/named_params -->
O suporte para <link linkend="functions.named-arguments">Argumentos nomeados</link> foi adicionado.
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.attributes">
<title>Atributos</title>
<para>
Suporte para <link linkend="language.attributes">Atributos</link> foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/attributes_v2 -->
<!-- RFC: https://wiki.php.net/rfc/attribute_amendments -->
<!-- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax -->
<!-- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax_change -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.property-promotion">
<title>Promoção de propriedade do construtor</title>
<para>
Suporte para <link linkend="language.oop5.decon.constructor.promotion">promoção de propriedade do construtor</link> (declarando propriedades na assinatura do construtor)
foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/constructor_promotion -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.union-types">
<title>União de Tipos</title>
<para>
O suporte para <link linkend="language.types.declarations.composite.union">união de tipos</link> foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/union_types_v2 -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.match">
<title>Expressão Match</title>
<para>
O suporte para <link linkend="control-structures.match">expressões <literal>match</literal></link> foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/match_expression_v2 -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.nullsafe-operator">
<title>Operador Nullsafe</title>
<para>
Suporte para o <link linkend="language.oop5.basic.nullsafe">nullsafe operador</link> (<literal>?-></literal>) foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/nullsafe_operator -->
</para>
</sect3>
<sect3 xml:id="migration80.new-features.core.others">
<title>Outros novos recursos</title>
<itemizedlist>
<listitem>
<para>
A classe <link linkend="class.weakmap">WeakMap</link> foi adicionada.
<!-- RFC: https://wiki.php.net/rfc/weak_maps -->
</para>
</listitem>
<listitem>
<para>
A classe <classname>ValueError</classname> foi adicionada.
</para>
</listitem>
<listitem>
<para>
Qualquer número de parâmetros de função agora pode ser substituído por um argumento variádico, desde que os
tipos sejam compatíveis. Por exemplo, o seguinte código agora é permitido:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
<type>static</type> (como em "vinculação estática tardia") agora pode ser usado como um tipo de retorno:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
class Test {
public function create(): static {
return new static();
}
}
?>
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/static_return_type -->
</para>
</listitem>
<listitem>
<para>
Agora é possível buscar o nome da classe de um objeto usando
<code>$object::class</code>. O resultado é o mesmo que <code>get_class($object)</code>.
<!-- RFC: https://wiki.php.net/rfc/class_name_literal_on_object -->
</para>
</listitem>
<listitem>
<para>
&new; e &instanceof; agora podem ser usados com expressões arbitrárias,
usando <code>new (expression)(...$args)</code> e <code>$obj instanceof (expression)</code>.
<!-- RFC: https://wiki.php.net/rfc/variable_syntax_tweaks -->
</para>
</listitem>
<listitem>
<para>
Algumas correções de consistência na sintaxe da variável foram aplicadas, por exemplo, escrever
<code>Foo::BAR::$baz</code> agora é permitido.
<!-- RFC: https://wiki.php.net/rfc/variable_syntax_tweaks -->
</para>
</listitem>
<listitem>
<para>
Adicionada interface <interfacename>Stringable</interfacename>, que é implementada automaticamente se
uma classe definir um método <link linkend="object.tostring">__toString()</link>.
<!-- RFC: https://wiki.php.net/rfc/stringable -->
</para>
</listitem>
<listitem>
<para>
As Traits agora podem definir métodos privados abstratos.
Tais métodos devem ser implementados pela classe que usa o trait.
<!-- RFC: https://wiki.php.net/rfc/abstract_trait_method_validation -->
</para>
</listitem>
<listitem>
<para>
<literal>throw</literal> agora pode ser usado como uma expressão.
Isso permite usos como:
<programlisting role="php">
<![CDATA[
<?php
$fn = fn() => throw new Exception('Exceção na função de seta');
$user = $session->user ?? throw new Exception('É necessário haver um usuário.');
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/throw_expression -->
</para>
</listitem>
<listitem>
<para>
Uma vírgula final opcional agora é permitida nas listas de parâmetros.
<programlisting role="php">
<![CDATA[
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- Esta vírgula agora é permitida.
) {
}
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/trailing_comma_in_parameter_list -->
</para>
</listitem>
<listitem>
<para>
Agora é possível escrever <code>catch (Exception)</code> para capturar uma exceção sem armazená-la
em uma variável.
<!-- RFC: https://wiki.php.net/rfc/non-capturing_catches -->
</para>
</listitem>
<listitem>
<para>
O suporte para tipo <type>mixed</type> foi adicionado.
<!-- RFC: https://wiki.php.net/rfc/mixed_type_v2 -->
</para>
</listitem>
<listitem>
<para>
Os métodos privados declarados em uma classe pai não impõem mais nenhuma regra de herança nos métodos
de uma classe filha (com exceção dos construtores privados finais).
O exemplo a seguir ilustra quais restrições foram removidas:
<programlisting role="php">
<![CDATA[
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// Lança um aviso, pois "final" não tem mais efeito:
private final function method4() {}
}
class ChildClass extends ParentClass {
// Todos os itens a seguir agora são permitidos, mesmo que os modificadores não sejam
// o mesmo que para os métodos privados na classe pai.
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?>
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/inheritance_private_methods -->
</para>
</listitem>
<listitem>
<para>
<function>get_resource_id</function> foi adicionado, o que retorna o mesmo valor que
<code>(int) $resource</code>. Ele fornece a mesma funcionalidade em uma API mais clara.
</para>
</listitem>
<listitem>
<para>
O <classname>InternalIterator</classname> foi adicionado.
</para>
</listitem>
</itemizedlist>
</sect3>
</sect2>
<sect2 xml:id="migration80.new-features.date">
<title>Data e hora</title>
<itemizedlist>
<listitem>
<para>
<methodname>DateTime::createFromInterface</methodname> e
<methodname>DateTimeImmutable::createFromInterface</methodname> foram adicionados.
</para>
</listitem>
<listitem>
<para>
O especificador de formato DateTime <literal>p</literal> foi adicionado, que é o mesmo que
<literal>P</literal>, mas retorna <literal>Z</literal> em vez de <literal>+00:00</literal>
para UTC.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.new-features.dom">
<title>DOM</title>
<para>
<interfacename>DOMParentNode</interfacename> e <interfacename>DOMChildNode</interfacename> com
novas APIs de travessia e manipulação foram adicionadas.
<!-- RFC: https://wiki.php.net/rfc/dom_living_standard_api-->
</para>
</sect2>
<sect2 xml:id="migration80.new-features.filter">
<title>Filtro</title>
<para>
<constant>FILTER_VALIDATE_BOOL</constant> foi adicionado como um alias para
<constant>FILTER_VALIDATE_BOOLEAN</constant>. O novo nome é preferido, pois usa o nome do
tipo canônico.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.enchant">
<title>Enchant</title>
<para>
<function>enchant_dict_add</function>, <function>enchant_dict_is_added</function> e
<constant>LIBENCHANT_VERSION</constant>foram adicionados.chant
</para>
</sect2>
<sect2 xml:id="migration80.new-features.fpm">
<title>FPM</title>
<para>
Adicionada uma nova opção <literal>pm.status_listen</literal> que permite obter o status de um
terminal diferente (por exemplo, porta ou arquivo UDS), o que é útil para obter o status
quando todos os filhos estão ocupados atendendo a solicitações de execução longa.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.hash">
<title>Hash</title>
<para>
Os objetos <classname>HashContext</classname> agora podem ser serializados.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.intl">
<title>Funções de Internacionalização</title>
<para>
As constantes <constant>IntlDateFormatter::RELATIVE_FULL</constant>,
<constant>IntlDateFormatter::RELATIVE_LONG</constant>,
<constant>IntlDateFormatter::RELATIVE_MEDIUM</constant> e
<constant>IntlDateFormatter::RELATIVE_SHORT</constant>
foram adicionadas.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.ldap">
<title>LDAP</title>
<para>
<function>ldap_count_references</function> foi adicionado, o que retorna o número
de mensagens de referência em um resultado de pesquisa.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.opcache">
<title>OPcache</title>
<para>
Se a configuração ini <!--<link linkend="ini.opcache.record-warnings">-->opcache.record_warnings<!--</link>--> estiver
habilitada, o OPcache gravará avisos em tempo de compilação e os reproduzirá na próxima inclusão, mesmo que
seja servido do cache.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.openssl">
<title>OpenSSL</title>
<para>
Adicionado suporte de sintaxe de mensagem criptográfica (CMS) (<link xlink:href="&url.rfc;5652">RFC 5652</link>)
composto de funções para criptografia, descriptografia, assinatura, verificação e leitura. A API
é semelhante à API para funções <acronym>PKCS</acronym> #7 com a adição de novas constantes de codificação:
<constant>OPENSSL_ENCODING_DER</constant>, <constant>OPENSSL_ENCODING_SMIME</constant>
e <constant>OPENSSL_ENCODING_PEM</constant>:
<simplelist>
<member>
<function>openssl_cms_encrypt</function> criptografa a mensagem no arquivo com os certificados e
gera o resultado no arquivo fornecido.
</member>
<member>
<function>openssl_cms_decrypt</function> descriptografa a mensagem S/MIME no arquivo e envia
os resultados para o arquivo fornecido.
</member>
<member>
<function>openssl_cms_read</function> exporta o arquivo CMS para um array de
certificados <acronym>PEM</acronym>.
</member>
<member>
<function>openssl_cms_sign</function> assina a mensagem MIME no arquivo com um certificado e
uma chave e gera o resultado no arquivo fornecido.
</member>
<member>
<function>openssl_cms_verify</function> verifica se o bloco de dados está intacto, o signatário
é quem diz ser e retorna os certificados dos signatários.
</member>
</simplelist>
</para>
</sect2>
<sect2 xml:id="migration80.new-features.pcre">
<title>Expressões Regulares (Compatíveis com Perl)</title>
<para>
<function>preg_last_error_msg</function> foi adicionada, que retorna uma mensagem legível por humanos para o último
erro PCRE. Ela complementa <function>preg_last_error</function>, que retorna um valor de enumeração
inteiro.
</para>
</sect2>
<sect2 xml:id="migration80.new-features.reflection">
<title>Reflection</title>
<itemizedlist>
<listitem>
<para>
Os seguintes métodos agora podem retornar informações sobre valores padrão
de parâmetros de funções internas:
</para>
<para>
<simplelist>
<member><methodname>ReflectionParameter::isDefaultValueAvailable</methodname></member>
<member><methodname>ReflectionParameter::getDefaultValue</methodname></member>
<member><methodname>ReflectionParameter::isDefaultValueConstant</methodname></member>
<member><methodname>ReflectionParameter::getDefaultValueConstantName</methodname></member>
</simplelist>
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.new-features.sqlite3">
<title>SQLite3</title>
<para>
<methodname>SQLite3::setAuthorizer</methodname> e respectivas constantes de classe foram adicionados
para definir um callback userland que será usado para autorizar ou não uma ação no banco de dados.
<!-- PR: https://github.com/php/php-src/pull/4797 -->
</para>
</sect2>
<sect2 xml:id="migration80.new-features.standard">
<title>Biblioteca padrão</title>
<itemizedlist>
<listitem>
<para>
<function>str_contains</function>, <function>str_starts_with</function> e
<function>str_ends_with</function> foram adicionados, que verificam se <parameter>haystack</parameter> contém,
começa com ou termina com <parameter>needle</parameter>, respectivamente.
<!-- RFC: https://wiki.php.net/rfc/str_contains -->
<!-- RFC: https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions -->
</para>
</listitem>
<listitem>
<para>
<function>fdiv</function> foi adicionado, que executa uma divisão de ponto flutuante sob a semântica IEEE 754.
A divisão por zero é considerada bem definida e retornará um de <literal>Inf</literal>,
<literal>-Inf</literal> ou <literal>NaN</literal>.
</para>
</listitem>
<listitem>
<para>
<function>get_debug_type</function> foi adicionado, o que retorna um tipo útil para mensagens de erro. Ao contrário de
<function>gettype</function>, ele usa nomes de tipo canônico, retorna nomes de classe para objetos e
indica o tipo de recurso para recursos.
<!-- RFC: https://wiki.php.net/rfc/get_debug_type -->
</para>
</listitem>
<listitem>
<para>
<function>printf</function> e amigos agora suportam os especificadores de formato <literal>%h</literal> e
<literal>%H</literal>. Estes são os mesmos que <literal>%g</literal> e
<literal>%G</literal>, mas sempre use <literal>"."</literal> como o separador decimal, em vez
de determiná-lo por meio da localidade <constant>LC_NUMERIC</constant>.
</para>
</listitem>
<listitem>
<para>
<function>printf</function> e amigos agora suportam o uso de <literal>"*"</literal> como largura
ou precisão, caso em que a largura/precisão é passada como um argumento para printf. Isso também permite
usar a precisão <literal>-1</literal> com <literal>%g</literal>, <literal>%G</literal>,
<literal>%h</literal> e <literal>%H</literal>. Por exemplo, o código a seguir pode ser usado para
reproduzir a formatação de ponto flutuante padrão do PHP:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
<function>proc_open</function> agora suporta descritores pseudo-terminal (PTY). O seguinte
anexa <literal>stdin</literal>, <literal>stdout</literal> e <literal>stderr</literal> ao
mesmo PTY:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
<function>proc_open</function> agora suporta descritores de pares de sockets. O seguinte anexa
um par de sockets distinto a <literal>stdin</literal>, <literal>stdout</literal> e
<literal>stderr</literal>:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>
]]>
</programlisting>
</para>
<para>
Ao contrário dos pipes, os sockets não sofrem com problemas de bloqueio de E/S no Windows.
No entanto, nem todos os programas podem funcionar corretamente com soquetes stdio.
</para>
</listitem>
<listitem>
<para>
As funções de classificação agora são estáveis, o que significa que os elementos de comparação igual
manterão sua ordem original.
<!-- RFC: https://wiki.php.net/rfc/stable_sorting -->
</para>
</listitem>
<listitem>
<para>
<function>array_diff</function>, <function>array_intersect</function> e suas variações agora podem
ser usadas com um único array como argumento. Isso significa que usos como os seguintes agora são
possíveis:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
// OK, mesmo que $excludes esteja vazio:
array_diff($array, ...$excludes);
// OK, mesmo que $arrays contenha apenas um único array:
array_intersect(...$arrays);
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
O parâmetro <parameter>flag</parameter> de <function>ob_implicit_flush</function> foi alterado
para aceitar um <type>bool</type> em vez de um <type>int</type>.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.new-features.tokenizer">
<title>Tokenizador</title>
<para>
<classname>PhpToken</classname> adiciona uma interface baseada em objeto ao tokenizer. Ele fornece uma
representação mais uniforme e ergonômica, além de ser mais eficiente em termos de memória e mais rápido.
<!-- RFC: https://wiki.php.net/rfc/token_as_object -->
</para>
</sect2>
<sect2 xml:id="migration80.new-features.zip">
<title>Zip</title>
<itemizedlist>
<listitem>
<para>
A extensão Zip foi atualizada para a versão 1.19.1.
</para>
</listitem>
<listitem>
<para>
Novo <methodname>ZipArchive::setMtimeName</methodname> e
<methodname>ZipArchive::setMtimeIndex</methodname> para definir a hora de modificação de uma entrada.
</para>
</listitem>
<listitem>
<para>
Novo <methodname>ZipArchive::registerProgressCallback</methodname> para fornecer atualizações durante o fechamento do arquivo.
</para>
</listitem>
<listitem>
<para>
Novo <methodname>ZipArchive::registerCancelCallback</methodname> para permitir o cancelamento durante o fechamento
do arquivo.
</para>
</listitem>
<listitem>
<para>
Novo <methodname>ZipArchive::replaceFile</methodname> para substituir um conteúdo de entrada.
</para>
</listitem>
<listitem>
<para>
Novo <methodname>ZipArchive::isCompressionMethodSupported</methodname> para verificar os recursos opcionais de
compactação.
</para>
</listitem>
<listitem>
<para>
Novo <methodname>ZipArchive::isEncryptionMethodSupported</methodname> para verificar os recursos opcionais de
criptografia.
</para>
</listitem>
<listitem>
<para>
A propriedade <varname>ZipArchive::lastId</varname> para obter o valor do índice da
última entrada adicionada foi adicionada.
</para>
</listitem>
<listitem>
<para>
Os erros agora podem ser verificados após o fechamento de um arquivo usando as propriedades
<varname>ZipArchive::status</varname> e
<varname>ZipArchive::statusSys</varname> ou o método
<methodname>ZipArchive::getStatusString</methodname>.
</para>
</listitem>
<listitem>
<para>
A opção <literal>'remove_path'</literal> de <methodname>ZipArchive::addGlob</methodname> e
<methodname>ZipArchive::addPattern</methodname> agora é tratada como um prefixo de string arbitrário (para
consistência com a opção <literal>'add_path'</literal>), enquanto anteriormente era tratada como um
nome de diretório.
</para>
</listitem>
<listitem>
<para>
Os recursos opcionais de compactação/criptografia agora estão listados no phpinfo.
</para>
</listitem>
</itemizedlist>
</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
-->