Files
archived-doc-pt-br/appendices/migration80/incompatible.xml
2025-09-01 13:26:14 -03:00

1720 lines
64 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: b94d63fc0884d83ba43433ab33cc4810d955bf6d Maintainer: leonardolara Status: ready --><!-- CREDITS: geekcom,adiel,lhsazevedo,atomotavio,ae,leonardolara -->
<sect1 xml:id="migration80.incompatible" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Alterações incompatíveis com versões anteriores</title>
<sect2 xml:id="migration80.incompatible.core">
<title>Núcleo do PHP</title>
<sect3 xml:id="migration80.incompatible.core.string-number-comparision">
<title>Comparação entre String e Número</title>
<para>
Comparações não estritas entre números e strings não numéricas, agora funcionam convertendo o número em
string e comparando as strings. As comparações entre números e strings numéricas continuam
funcionando como antes. Notavelmente, isso significa que a comparação: <code>0 == "not-a-number"</code> agora é considerada
falsa.
<informaltable>
<tgroup cols="3">
<thead>
<row>
<entry>Comparação</entry>
<entry>Antes</entry>
<entry>Depois</entry>
</row>
</thead>
<tbody>
<row>
<entry><code>0 == "0"</code></entry>
<entry>&true;</entry>
<entry>&true;</entry>
</row>
<row>
<entry><code>0 == "0.0"</code></entry>
<entry>&true;</entry>
<entry>&true;</entry>
</row>
<row>
<entry><code>0 == "foo"</code></entry>
<entry>&true;</entry>
<entry>&false;</entry>
</row>
<row>
<entry><code>0 == ""</code></entry>
<entry>&true;</entry>
<entry>&false;</entry>
</row>
<row>
<entry><code>42 == " 42"</code></entry>
<entry>&true;</entry>
<entry>&true;</entry>
</row>
<row>
<entry><code>42 == "42foo"</code></entry>
<entry>&true;</entry>
<entry>&false;</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<!-- RFC: https://wiki.php.net/rfc/string_to_number_comparison -->
</para>
</sect3>
<sect3 xml:id="migration80.incompatible.core.other">
<title>Outras mudanças incompatíveis</title>
<itemizedlist>
<listitem>
<para>
<literal>match</literal> agora é uma palavra reservada.
</para>
</listitem>
<listitem>
<para>
<literal>mixed</literal> agora é uma palavra reservada, portanto, não pode ser usado para nomear uma classe, interface ou trait, e também é proibido de ser usado em namespaces.
</para>
</listitem>
<listitem>
<para>
As falhas de asserção agora são lançadas por padrão. Se o comportamento antigo é desejado,
<code>assert.exception=0</code> pode ser definido nas configurações INI.
</para>
</listitem>
<listitem>
<para>
Métodos com o mesmo nome de classe não são mais interpretados como construtores. O
método <link linkend="object.construct">__construct()</link> deve ser utilizado em seu lugar.
</para>
</listitem>
<listitem>
<para>
A capacidade de chamar métodos não estáticos estaticamente foi removida. Por isso
a função <function>is_callable</function> irá falhar ao verificar um método não estático com
um nome de classe (deve se realizar uma verificação com uma instância de objeto).
</para>
</listitem>
<listitem>
<para>
Foram removidas as conversões de tipos, <code>(real)</code> e <code>(unset)</code>.
</para>
</listitem>
<listitem>
<para>
A diretiva do php.ini <link linkend="ini.track-errors">track_errors</link> foi removida. Isto
significa que a variável <varname>php_errormsg</varname> não está mais disponível. A função
<function>error_get_last</function> deve ser utilizada em seu lugar.
</para>
</listitem>
<listitem>
<para>
A capacidade de definir constantes que não diferenciam maiúsculas de minúsculas foi removida. O
terceiro argumento para a função <function>define</function> não pode ser mais &true;.
</para>
</listitem>
<listitem>
<para>
A capacidade de especificar um auto carregamento utilizando a função <function>__autoload</function> foi
removida. A função <function>spl_autoload_register</function> deve ser utilizada em seu lugar.
</para>
</listitem>
<listitem>
<para>
O argumento <parameter>errcontext</parameter> não será mais usado para manipulação de erros personalizados
definido com a função <function>set_error_handler</function>.
</para>
</listitem>
<listitem>
<para>
A função <function>create_function</function> foi removida. Ao invés disso, funções anônimas devem ser utilizadas.
</para>
</listitem>
<listitem>
<para>
A função <function>each</function> foi removida. &foreach; ou <classname>ArrayIterator</classname>
devem ser utilizados em seu lugar.
</para>
</listitem>
<listitem>
<para>
Foi removida a capacidade de desvincular <varname>this</varname> de closures que foram
criadas a partir de um método, usando <methodname>Closure::fromCallable</methodname> ou
<methodname>ReflectionMethod::getClosure</methodname>.
</para>
</listitem>
<listitem>
<para>
A habilidade de desvincular <varname>this</varname> de closures que contêm usos de
<varname>this</varname> também foi removida.
</para>
</listitem>
<listitem>
<para>
A habilidade de utilizar a função <function>array_key_exists</function> com objetos foi removida.
as funções <function>isset</function> ou <function>property_exists</function> devem ser usadas em seu lugar.
</para>
</listitem>
<listitem>
<para>
O comportamento da função <function>array_key_exists</function> com relação ao tipo do parâmetro
<parameter>key</parameter> agora é consistente com a função <function>isset</function> e
acesso normal à arrays. Todos os tipos de chave agora usam as coerções usuais e as chaves de
array/objeto lançam um <classname>TypeError</classname>.
</para>
</listitem>
<listitem>
<para>
Qualquer array com número <replaceable>n</replaceable> em sua primeira posição utilizará
<replaceable>n+1</replaceable> em sua próxima chave implícita mesmo se <replaceable>n</replaceable>
for negativo.
<!-- RFC: https://wiki.php.net/rfc/negative_array_index -->
</para>
</listitem>
<listitem>
<para>
O nível de error_reporting padrão agora é <constant>E_ALL</constant>. Anteriormente excluía
<constant>E_NOTICE</constant> e <constant>E_DEPRECATED</constant>.
</para>
</listitem>
<listitem>
<para>
<link linkend="ini.display-startup-errors">display_startup_errors</link> agora é habilitado por
padrão.
</para>
</listitem>
<listitem>
<para>
Usar <type>parent</type> dentro de uma classe sem pai agora produzirá um erro fatal
em tempo de execução.
</para>
</listitem>
<listitem>
<para>
O operador <literal>@</literal> não irá mais silenciar erros fatais
(<constant>E_ERROR</constant>, <constant>E_CORE_ERROR</constant>,
<constant>E_COMPILE_ERROR</constant>, <constant>E_USER_ERROR</constant>,
<constant>E_RECOVERABLE_ERROR</constant>, <constant>E_PARSE</constant>). Manipuladores de erros que
esperam que error_reporting seja <literal>0</literal> quando <literal>@</literal> é usado, devem
ser ajustados para usar uma verificação de máscara:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
// Substituir isso ...
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (error_reporting() == 0) {
return false;
}
// ...
}
// ... por isso:
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (!(error_reporting() & $err_no)) {
return false;
}
// ...
}
?>
]]>
</programlisting>
</para>
<para>
Adicionalmente, cuidados devem ser tomados para que mensagens de erro não sejam mostradas
no ambiente de produção, o que pode resultar em vazamento de informações. Certifique-se
de que a diretiva <code>display_errors=Off</code> seja usada em conjunto com o log de erros.
</para>
</listitem>
<listitem>
<para>
<literal>#[</literal> não é mais interpretado como o início de um comentário,
já que esta sintaxe é utilizada agora para atributos.
<!-- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax_change -->
</para>
</listitem>
<listitem>
<para>
Erros de herança devido a assinaturas de métodos incompatíveis (violações de LSP) agora sempre gerarão
um erro fatal. Antes, um aviso era gerado em alguns casos.
<!-- RFC: https://wiki.php.net/rfc/lsp_errors -->
</para>
</listitem>
<listitem>
<para>
A precedência dos operadores de concatenação foi modificada em relação ao bitshifts tanto na adição
como na subtração.
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
echo "Sum: " . $a + $b;
// Era interpretado como:
echo ("Sum: " . $a) + $b;
// e passa a ser interpretado como:
echo "Sum:" . ($a + $b);
?>
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/concatenation_precedence -->
</para>
</listitem>
<listitem>
<para>
Argumentos com um valor padrão que avaliam &null; em tempo de execução, não irão mais marcar
o tipo do parâmetro como implícito. Um tipo explícito nulo, ou explicitamente &null; como argumento padrão
deve ser usado em seu lugar.
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
// Subistituir
function test(int $arg = CONST_RESOLVING_TO_NULL) {}
// Por isso
function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
// Ou isso
function test(int $arg = null) {}
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
Uma série de avisos foram convertidos para exceções do tipo <classname>Error</classname>:
</para>
<para>
<simplelist>
<member>
A tentativa de escrita em uma propriedade de um não-objeto. Anteriormente isso
criava implicitamente um objeto stdClass para strings nulas, falsas e vazias.
</member>
<member>
A tentativa de anexar um elemento a um array para a qual a chave PHP_INT_MAX
já está em uso.
</member>
<member>
Tentar usar um tipo inválido (array ou objeto) como uma chave de array ou
deslocamento de string.
</member>
<member>A tentativa de escrever em um índice de array de um valor escalar.</member>
<member>Tentar descompactar um não-array/Traversable.</member>
<member>
Tentar acessar constantes não qualificadas que são indefinidas.
Anteriormente, os acessos constantes não qualificados resultavam em um aviso e eram interpretados como strings.
</member>
<member>
Passar o número errado de argumentos para uma função sem argumento variadic
ira lançar uma exceção <classname>ArgumentCountError</classname>.
</member>
<member>
Passar tipos contáveis inválidos para <function>count</function> irá lançar
uma exceção <classname>TypeError</classname>.
</member>
</simplelist>
</para>
<para>
Uma série de notificações foram convertidas em avisos:
</para>
<para>
<simplelist>
<member>A tentativa de leitura em uma variável não definida.</member>
<member>A tentativa de leitura em uma propriedade não definida.</member>
<member>A tentativa de leitura em uma chave de array não definido.</member>
<member>A tentativa de leitura em uma propriedade de um não-objeto.</member>
<member>A tentativa de acesso em um índice de array em um não-array.</member>
<member>A tentativa de conversão de um array para uma string.</member>
<member>A tentativa de usar um resource como uma chave de array.</member>
<member>A tentativa de usar null, um booleano ou um número de ponto flutuante(float) como uma posição em uma string.</member>
<member>A tentativa de leitura em uma posição fora dos limites de uma string.</member>
<member>A tentativa de atribuir uma string vazia a uma posição de uma string.</member>
</simplelist>
<!-- RFC: https://wiki.php.net/rfc/engine_warnings -->
</para>
</listitem>
<listitem>
<para>
A tentativa de atribuir múltiplos bytes em uma posição de uma string agora emite um aviso.
</para>
</listitem>
<listitem>
<para>
Caracteres inesperados no código fonte (como bytes NUL fora de strings) agora irá resultar em uma
exceção <classname>ParseError</classname> em vez de um aviso do compilador.
</para>
</listitem>
<listitem>
<para>
As exceções não capturadas agora passam por "desligamento limpo", o que significa que os destrutores são chamados
após uma exceção não detectada.
</para>
</listitem>
<listitem>
<para>
O erro fatal em tempo de compilação "Only variables can be passed by reference" foi adiado até o
tempo de execução, e convertido em uma exceção de <classname>Error</classname>
"Argument cannot be passed by reference".
</para>
</listitem>
<listitem>
<para>
Alguns alertas do tipo "Only variables should be passed by reference" foram convertidas para
exceções do tipo "Argument cannot be passed by reference"
</para>
</listitem>
<listitem>
<para>
O nome gerado para classes anônimas foi modificado. Agora, inclui o nome da primeira classe ou
interface:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
new class extends ParentClass {};
// -> ParentClass@anonymous
new class implements FirstInterface, SecondInterface {};
// -> FirstInterface@anonymous
new class {};
// -> class@anonymous
?>
]]>
</programlisting>
</para>
<para>
O nome mostrado acima ainda é seguido por um byte NUL e um sufixo único.
</para>
</listitem>
<listitem>
<para>
As referências de método de traits não absolutas em adaptações de alias de traits agora precisam ser
inequívocas:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
class X {
use T1, T2 {
func as otherFunc;
}
function func() {}
}
?>
]]>
</programlisting>
</para>
<para>
Se <code>T1::func()</code> e <code>T2::func()</code> existem, este código anteriormente era
aceito de forma silenciosa e func assumia referência a <code>T1::func</code>. Agora irá gerar um
erro fatal, e <code>T1::func</code> ou <code>T2::func</code> precisam ser
escritos explicitamente.
</para>
</listitem>
<listitem>
<para>
A assinatura de métodos abstratos definido nas características agora é verificada no método de implementação
da classe:
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
trait MyTrait {
abstract private function neededByTrait(): string;
}
class MyClass {
use MyTrait;
// Erro por conta do retorno desalinhado.
private function neededByTrait(): int { return 42; }
}
?>
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/abstract_trait_method_validation -->
</para>
</listitem>
<listitem>
<para>
Funções desabilitadas agora são tratadas da mesma forma que funções não existentes. Ao chamar
uma função desabilitada será informado que ela é desconhecida, e redefinir uma função desabilitada agora é possível.
</para>
</listitem>
<listitem>
<para>
Os empacotadores de fluxo <literal>data://</literal> não podem mais ser writable (gravável), indo
de encontro ao comportamento documentado.
</para>
</listitem>
<listitem>
<para>
Os operadores aritméticos e bitwise (bit a bit) <literal>+</literal>, <literal>-</literal>,
<literal>*</literal>, <literal>/</literal>, <literal>**</literal>, <literal>%</literal>,
<literal>&lt;&lt;</literal>, <literal>&gt;&gt;</literal>, <literal>&amp;</literal>,
<literal>|</literal>, <literal>^</literal>, <literal>~</literal>, <literal>++</literal>,
<literal>--</literal> irão agora apresentar um <classname>TypeError</classname> quando um dos
operandos estiver em um &array;, &resource; ou em um &object; não sobrecarregado (non-overloaded). A única exceção a isto é
a operação de mesclagem de array com <literal>+</literal>, que permanece suportada.
<!-- RFC: https://wiki.php.net/rfc/arithmetic_operator_type_checks -->
</para>
</listitem>
<listitem>
<para>
A conversão de float para string agora sempre terá o mesmo comportamento, independentemente da localidade.
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
setlocale(LC_ALL, "de_DE");
$f = 3.14;
echo $f, "\n";
// Anteriormente: 3,14
// Agora: 3.14
?>
]]>
</programlisting>
</para>
<para>
Veja as funções <function>printf</function>, <function>number_format</function> e
<methodname>NumberFormatter</methodname> para customizar a formatação de números.
<!-- RFC: https://wiki.php.net/rfc/locale_independent_float_to_string -->
</para>
</listitem>
<listitem>
<para>
O suporte para chaves (curly braces), cujo uso para acesso de deslocamento estava descontinuado, foi removido.
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
// Ao invés de:
$array{0};
$array{"key"};
// Usar:
$array[0];
$array["key"];
?>
]]>
</programlisting>
<!-- RFC: https://wiki.php.net/rfc/deprecate_curly_braces_array_access -->
</para>
</listitem>
<listitem>
<para>
Aplicar o modificador final ou método privado agora irá produzir um aviso, a menos que o método
seja o construtor.
<!-- FC: https://wiki.php.net/rfc/inheritance_private_methods -->
</para>
</listitem>
<listitem>
<para>
Se um objeto construtor chama a função <function>exit</function>, o objeto destrutor não será chamado.
Isto vai de encontro ao comportamento que o construtor lança.
</para>
</listitem>
<listitem>
<para>
Nomes de Namespace não podem mais conter espaços em branco: Enquanto <code>Foo\Bar</code> será reconhecido
como um nome de Namespace, <code>Foo \ Bar</code> não será. Por outro lado, as palavras-chave agora serão
permitidas como segmentos de um namespace, o que permite a mudança na interpretação do código:
<code>new\x</code> agora é o mesmo que <code>constant('new\x')</code>,
e não <code>new \x()</code>.
<!-- RFC: https://wiki.php.net/rfc/namespaced_names_as_token -->
</para>
</listitem>
<listitem>
<para>
Os ternários aninhados agora exigem parênteses explícitos.
<!-- RFC: https://wiki.php.net/rfc/ternary_associativity -->
</para>
</listitem>
<listitem>
<para>
<function>debug_backtrace</function> e <methodname>Exception::getTrace</methodname> agora não mais
apresentam referências aos argumentos. Não será possível mudar os argumentos de uma função
através de um backtrace.
</para>
</listitem>
<listitem>
<para>
O uso de strings numéricas foi modificado para ser mais intuitivo e menos sujeito a erros. Seguindo
os espaços em branco, é permitido agora strings numéricas para tratamento de consistência contendo espaços em branco.
Isso afeta principalmente:
</para>
<para>
<simplelist>
<member>A função <function>is_numeric</function></member>
<member>Comparações string a string </member>
<member>Declaração de tipos</member>
<member>Operações de incremento e decremento</member>
</simplelist>
</para>
<para>
O conceito de um "leading-numeric string" foi praticamente abandonado; os casos onde permanecem
são para facilitar a migração. Strings que emitem um <constant>E_NOTICE</constant> "A non
well-formed numeric value encountered" agora emitirão um <constant>E_WARNING</constant> "A
non-numeric value encountered" e todas as strings que emitiram um <constant>E_WARNING</constant> "A
non-numeric value encountered" agora lançarão um erro
<classname>TypeError</classname>. Isso afeta principalmente:
</para>
<para>
<simplelist>
<member>Operações aritméticas</member>
<member>Operações bit a bit</member>
</simplelist>
</para>
<para>
Esta mudança do <constant>E_WARNING</constant> para <classname>TypeError</classname> também afeta o
<constant>E_WARNING</constant> "Illegal string offset 'string'" para o posicionamento ilegal de strings. O
comportamento de conversões explícitas de strings para int/float não foi alterado.
<!-- RFC: https://wiki.php.net/rfc/saner-numeric-strings -->
</para>
</listitem>
<listitem>
<para>
Métodos mágicos agora podem ter argumentos e retornar tipos verificados se eles foram declarados.
As assinaturas devem corresponder à seguinte lista:
</para>
<para>
<simplelist>
<member><code>__call(string $name, array $arguments): mixed</code></member>
<member><code>__callStatic(string $name, array $arguments): mixed</code></member>
<member><code>__clone(): void</code></member>
<member><code>__debugInfo(): ?array</code></member>
<member><code>__get(string $name): mixed</code></member>
<member><code>__invoke(mixed $arguments): mixed</code></member>
<member><code>__isset(string $name): bool</code></member>
<member><code>__serialize(): array</code></member>
<member><code>__set(string $name, mixed $value): void</code></member>
<member><code>__set_state(array $properties): object</code></member>
<member><code>__sleep(): array</code></member>
<member><code>__unserialize(array $data): void</code></member>
<member><code>__unset(string $name): void</code></member>
<member><code>__wakeup(): void</code></member>
</simplelist>
<!-- RFC: https://wiki.php.net/rfc/magic-methods-signature -->
</para>
</listitem>
<listitem>
<para>
As chaves do array passados para a função <function>call_user_func_array</function> agora podem ser interpretadas
como nomes de parâmetros, em vez de serem silenciosamente ignoradas.
</para>
</listitem>
<listitem>
<para>
A declaração da função chamada <literal>assert()</literal> dentro de um namespace não é
mais permitida e gera um <constant>E_COMPILE_ERROR</constant>.
A função <function>assert</function> recebe um tratamento especial pelo motor do PHP,
o que pode levar a comportamentos inconsistentes quando definido como uma função de namespace com o mesmo nome.
</para>
</listitem>
</itemizedlist>
</sect3>
</sect2>
<sect2 xml:id="migration80.incompatible.resource2object">
<title>Migração de Resource para Objeto</title>
<para>
Diversos &resource;s foram migrados para &object;s.
Verificações de valor de retorno usando a função <function>is_resource</function> devem ser substituídas por checagens para &false;.
</para>
<itemizedlist>
<listitem>
<para>
A função <function>curl_init</function> agora retornará um objeto <classname>CurlHandle</classname> ao invés
de um &resource;. A função <function>curl_close</function> não tem mais efeito,
em vez disso a instância da classe <classname>CurlHandle</classname> é destruída automaticamente se não for
mais referenciada.
</para>
</listitem>
<listitem>
<para>
A função <function>curl_multi_init</function> agora retornará um objeto <classname>CurlMultiHandle</classname> ao invés
de um &resource;. A função <function>curl_multi_close</function> não tem mais efeito,
em vez disso a instância da classe <classname>CurlMultiHandle</classname> é destruída automaticamente se não for
mais referenciada.
</para>
</listitem>
<listitem>
<para>
<function>curl_share_init</function> agora retornará um objeto <classname>CurlShareHandle</classname>
em vez de um &resource;. A função <function>curl_share_close</function> não tem mais efeito,
em vez disso a instância da classe <classname>CurlShareHandle</classname> é
destruída automaticamente se não for mais referenciada.
</para>
</listitem>
<listitem>
<para>
<function>enchant_broker_init</function> agora retornará um objeto <classname>EnchantBroker</classname>
em vez de um &resource;.
</para>
</listitem>
<listitem>
<para>
<function>enchant_broker_request_dict</function> e
<function>enchant_broker_request_pwl_dict</function> agora retornarão um objeto
<classname>EnchantDictionary</classname> em vez de um &resource;.
</para>
</listitem>
<listitem>
<para>
A extensão GD agora usa objetos <classname>GdImage</classname> como a estrutura de dados interna
para imagens, em vez de &resource;s.
A função <function>imagedestroy</function> não tem mais efeito; em vez disso a
instância <classname>GdImage</classname> é destruída automaticmanete se não for mais referenciada.
</para>
</listitem>
<listitem>
<para>
<function>openssl_x509_read</function> e <function>openssl_csr_sign</function> agora retornarão
um objeto <classname>OpenSSLCertificate</classname> em vez de um &resource;.
A função <function>openssl_x509_free</function> está descontinuada e não tem mais efeito,
em vez disso a instância <classname>OpenSSLCertificate</classname> é destruída automaticamente se
não for mais referenciada.
</para>
</listitem>
<listitem>
<para>
<function>openssl_csr_new</function> agora retornará um
objeto <classname>OpenSSLCertificateSigningRequest</classname> em vez de um &resource;.
</para>
</listitem>
<listitem>
<para>
<function>openssl_pkey_new</function> agora retornará um
objeto <classname>OpenSSLAsymmetricKey</classname> em vez de um &resource;.
A função <function>openssl_pkey_free</function> está descontinuada e não tem mais efeito,
em vez disso a instância <classname>OpenSSLAsymmetricKey</classname> é destruída automaticamente se
não for mais referenciada.
</para>
</listitem>
<listitem>
<para>
<function>shmop_open</function> irá agora retornar um objeto <classname>Shmop</classname> ao invés de
um &resource;. A função <function>shmop_close</function> não tem mais efeitos, e foi
descontinuada. A instância de <classname>Shmop</classname> será automaticamente destruída quando
não seja mais referenciada.
</para>
</listitem>
<listitem>
<para>
<function>socket_create</function>, <function>socket_create_listen</function>,
<function>socket_accept</function>, <function>socket_import_stream</function>,
<function>socket_addrinfo_connect</function>, <function>socket_addrinfo_bind</function>, e
<function>socket_wsaprotocol_info_import</function> agora retornarão um
objeto <classname>Socket</classname> em vez de um &resource;.
<function>socket_addrinfo_lookup</function> agora retornará um array de
objetos <classname>AddressInfo</classname> em vez de &resource;s.
</para>
</listitem>
<listitem>
<para>
<function>msg_get_queue</function> agora retornará um objeto <classname>SysvMessageQueue</classname>
em vez de um &resource;.
</para>
</listitem>
<listitem>
<para>
<function>sem_get</function> agora retornará um objeto <classname>SysvSemaphore</classname>
em vez de um &resource;.
</para>
</listitem>
<listitem>
<para>
<function>shm_attach</function> agora retornará um objeto <classname>SysvSharedMemory</classname>
em vez de um &resource;.
</para>
</listitem>
<listitem>
<para>
<function>xml_parser_create</function> e <function>xml_parser_create_ns</function> agora
retornarão um objeto <classname>XMLParser</classname> em vez de um &resource;. A função
<function>xml_parser_free</function> não tem mais efeito, em vez disso a instância XMLParser
é automaticamente destruída se não for mais referenciada.
</para>
</listitem>
<listitem>
<para>
A função <link linkend="book.xmlwriter">XMLWriter</link> agora aceita e retorna, respectivamente,
objetos <classname>XMLWriter</classname> em vez de &resource;s.
</para>
</listitem>
<listitem>
<para>
<function>inflate_init</function> agora retornará um objeto <classname>InflateContext</classname>
em vez de um &resource;.
</para>
</listitem>
<listitem>
<para>
<function>deflate_init</function> agora retornará um objeto <classname>DeflateContext</classname>
em vez de um &resource;.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.com">
<title>COM e .Net (Windows)</title>
<para>
A capacidade de importar constantes que não diferenciam maiúsculas de minúsculas de bibliotecas de tipos foi removida.
O segundo argumento para <function>com_load_typelib</function> não pode mais ser falso;
<link linkend="ini.com.autoregister-casesensitive">com.autoregister_casesensitive</link>
não pode mais ser desabilitado; marcadores que não diferenciam maiúsculas de minúsculas em
<link linkend="ini.com.typelib-file">com.typelib_file</link> são ignorados.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.curl">
<title>CURL</title>
<para>
<constant>CURLOPT_POSTFIELDS</constant> não aceita mais objetos como arrays. Para
interpretar um objeto como um array, executar uma conversão explícita de <code>(array)</code>. O
mesmo se aplica a outras opções que aceitam arrays também.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.datetime">
<title>Data e hora</title>
<para>
<function>mktime</function> e <function>gmmktime</function> agora requer pelo menos um
argumento. <function>time</function> pode ser usado para obter o registro de data e hora atual.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.dom">
<title>DOM</title>
<para>
Classes não implementadas da extensão DOM que não tinham comportamento e continham dados
de teste foram removidos. Essas classes também foram removidas na versão mais recente do
DOM padrão:
</para>
<para>
<simplelist>
<member><classname>DOMNameList</classname></member>
<member><classname>DomImplementationList</classname></member>
<member><classname>DOMConfiguration</classname></member>
<member><classname>DomError</classname></member>
<member><classname>DomErrorHandler</classname></member>
<member><classname>DOMImplementationSource</classname></member>
<member><classname>DOMLocator</classname></member>
<member><classname>DOMUserDataHandler</classname></member>
<member><classname>DOMTypeInfo</classname></member>
<member><classname>DOMStringExtend</classname></member>
</simplelist>
</para>
<para>
Métodos não implementados da extensão DOM que não tinham comportamento foram removidos:
</para>
<para>
<simplelist>
<member><methodname>DOMNamedNodeMap::setNamedItem</methodname></member>
<member><methodname>DOMNamedNodeMap::removeNamedItem</methodname></member>
<member><methodname>DOMNamedNodeMap::setNamedItemNS</methodname></member>
<member><methodname>DOMNamedNodeMap::removeNamedItemNS</methodname></member>
<member><methodname>DOMText::replaceWholeText</methodname></member>
<member><methodname>DOMNode::compareDocumentPosition</methodname></member>
<member><methodname>DOMNode::isEqualNode</methodname></member>
<member><methodname>DOMNode::getFeature</methodname></member>
<member><methodname>DOMNode::setUserData</methodname></member>
<member><methodname>DOMNode::getUserData</methodname></member>
<member><methodname>DOMDocument::renameNode</methodname></member>
</simplelist>
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.enchant">
<title>Enchant</title>
<itemizedlist>
<listitem>
<para>
<function>enchant_broker_list_dicts</function>, <function>enchant_broker_describe</function> e
<function>enchant_dict_suggest</function> agora retornam um array vazio no lugar de &null;.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.exif">
<title>Exif</title>
<para>
<function>read_exif_data</function> foi removido; <function>exif_read_data</function>
deve ser usado em seu lugar.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.filter">
<title>Filter</title>
<itemizedlist>
<listitem>
<para>
A <constant>FILTER_FLAG_SCHEME_REQUIRED</constant> e
<constant>FILTER_FLAG_HOST_REQUIRED</constant> sinalizadores para o filtro
<constant>FILTER_VALIDATE_URL</constant> foram removidas. O <literal>scheme</literal>
e <literal>host</literal> são (e foram) sempre necessários.
</para>
</listitem>
<listitem>
<para>
A fonte <constant>INPUT_REQUEST</constant> e <constant>INPUT_SESSION</constant> para
<function>filter_input</function> etc. foram removidos. Estes nunca foram implementados e seu
uso sempre gerou um warning.d
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.gd">
<title>GD</title>
<itemizedlist>
<listitem>
<para>
A função descontinuada <function>image2wbmp</function> foi removida.
<!-- RFC: https://wiki.php.net/rfc/image2wbmp -->
</para>
</listitem>
<listitem>
<para>
As funções descontinuadas <function>png2wbmp</function> e <function>jpeg2wbmp</function> foram
removidas.
<!-- RFC: https://wiki.php.net/rfc/deprecate-png-jpeg-2wbmp -->
</para>
</listitem>
<listitem>
<para>
O parametro padrão <parameter>mode</parameter> de <function>imagecropauto</function> não aceita mais
<literal>-1</literal>. <constant>IMG_CROP_DEFAULT</constant> deve ser usado no lugar.
</para>
</listitem>
<listitem>
<para>
No Windows, <filename>php_gd2.dll</filename> foi renomeado para <filename>php_gd.dll</filename>.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.gmp">
<title>GMP</title>
<para>
<function>gmp_random</function> foi removida. Uma das <function>gmp_random_range</function> ou
<function>gmp_random_bits</function> deve ser usado no lugar.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.iconv">
<title>Iconv</title>
<para>
implementações de iconv que não definem corretamente <varname>errno</varname> em caso de erros não são
mais suportadas.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.imap">
<title>IMAP</title>
<itemizedlist>
<listitem>
<para>
O argumento <parameter>default_host</parameter> não utilizado de <function>imap_headerinfo</function>
foi removido.
</para>
</listitem>
<listitem>
<para>
A função <function>imap_header</function> que é um alias de
<function>imap_headerinfo</function> foi removida.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.intl">
<title>Funções de Internacionalização</title>
<itemizedlist>
<listitem>
<para>
A constante descontinuada <constant>INTL_IDNA_VARIANT_2003</constant> foi removida.
<!-- RFC: https://wiki.php.net/rfc/deprecate-and-remove-intl_idna_variant_2003 -->
</para>
</listitem>
<listitem>
<para>
A constante descontinuada <constant>Normalizer::NONE</constant> foi removida.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.ldap">
<title>LDAP</title>
<itemizedlist>
<listitem>
<para>
As funções descontinuadas <function>ldap_sort</function>,
<function>ldap_control_paged_result</function> e
<function>ldap_control_paged_result_response</function> foram removidas.
</para>
</listitem>
<listitem>
<para>
A interface de<function>ldap_set_rebind_proc</function> foi mudada; o parâmetro
<parameter>callback</parameter> não aceita strings vazias; &null; deve ser
usado no lugar.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.mbstring">
<title>MBString</title>
<itemizedlist>
<listitem>
<para>
A diretiva <link linkend="ini.mbstring.func-overload">mbstring.func_overload</link> foi
removida. As constantes relacionadas <constant>MB_OVERLOAD_MAIL</constant>,
<constant>MB_OVERLOAD_STRING</constant>, e <constant>MB_OVERLOAD_REGEX</constant>
também foram removidas. Finalmente, a <literal>"func_overload"</literal> e a
<literal>"func_overload_list"</literal> entradas <function>mb_get_info</function> foram
removidas.
</para>
</listitem>
<listitem>
<para>
<function>mb_parse_str</function> não pode mais ser usado sem especificar um array de resultados.
</para>
</listitem>
<listitem>
<para>
Vários sinônimos mbregex descontinuados foram removidos. Veja a seguinte
lista para quais funções devem ser usadas:
</para>
<para>
<simplelist>
<member><function>mbregex_encoding</function><function>mb_regex_encoding</function></member>
<member><function>mbereg</function><function>mb_ereg</function></member>
<member><function>mberegi</function><function>mb_eregi</function></member>
<member><function>mbereg_replace</function><function>mb_ereg_replace</function></member>
<member><function>mberegi_replace</function><function>mb_eregi_replace</function></member>
<member><function>mbsplit</function><function>mb_split</function></member>
<member><function>mbereg_match</function><function>mb_ereg_match</function></member>
<member><function>mbereg_search</function><function>mb_ereg_search</function></member>
<member><function>mbereg_search_pos</function><function>mb_ereg_search_pos</function></member>
<member><function>mbereg_search_regs</function><function>mb_ereg_search_regs</function></member>
<member><function>mbereg_search_init</function><function>mb_ereg_search_init</function></member>
<member><function>mbereg_search_getregs</function><function>mb_ereg_search_getregs</function></member>
<member><function>mbereg_search_getpos</function><function>mb_ereg_search_getpos</function></member>
<member><function>mbereg_search_setpos</function><function>mb_ereg_search_setpos</function></member>
</simplelist>
</para>
</listitem>
<listitem>
<para>
O modificador <literal>e</literal> para <function>mb_ereg_replace</function> foi removido.
<function>mb_ereg_replace_callback</function> deve ser usado em seu lugar.
</para>
</listitem>
<listitem>
<para>
Um argumento de padrão não string para <function>mb_ereg_replace</function> agora será interpretado como
uma string em vez de um ponto de código ASCII. O comportamento anterior pode ser restaurado com uma chamada
explícita para <function>chr</function>.
</para>
</listitem>
<listitem>
<para>
O argumento <parameter>needle</parameter> para <function>mb_strpos</function>,
<function>mb_strrpos</function>, <function>mb_stripos</function>,
<function>mb_strripos</function>, <function>mb_strstr</function>,
<function>mb_stristr</function>, <function>mb_strrchr</function> e
<function>mb_strrichr</function> agora pode estar vazio.
</para>
</listitem>
<listitem>
<para>
O parâmetro <parameter>is_hex</parameter>, que não era usado internamente, foi removido de
<function>mb_decode_numericentity</function>.
</para>
</listitem>
<listitem>
<para>
O comportamento herdado de passar a codificação como o terceiro argumento em vez de um deslocamento para
a função <function>mb_strrpos</function> foi removida; um <literal>0</literal> explícito
offset com a codificação deve ser fornecido como o quarto argumento.
</para>
</listitem>
<listitem>
<para>
Os aliases de codificação de caracteres <literal>ISO_8859-*</literal> foram substituídos por
Aliases <literal>ISO8859-*</literal> para melhor interoperabilidade com a extensão iconv. os
aliases mbregex ISO 8859 com sublinhados (<literal>ISO_8859_*</literal> e
<literal>ISO8859_*</literal>) também foram removidos.
</para>
</listitem>
<listitem>
<para>
<function>mb_ereg</function> e <function>mb_eregi</function> agora retornarão valores booleanos &true; sobre
uma partida de sucesso. Anteriormente, eles retornavam inteiro <literal>1</literal> se
<parameter>matches</parameter> não foi passado, ou <code>max(1, strlen($matches[0]))</code> se
<parameter>matches</parameter> foi passado.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.oci8">
<title>OCI8</title>
<itemizedlist>
<listitem>
<para>
A classe <classname>OCI-Lob</classname> agora é chamada de <classname>OCILob</classname>, e a
a classe <classname>OCI-Collection</classname> agora se chama <classname>OCICollection</classname>
para conformidade de nome imposta pelas ferramentas de anotação de tipo PHP 8 arginfo.
</para>
</listitem>
<listitem>
<para>
Várias funções de alias foram marcadas como descontinuadas.
</para>
</listitem>
<listitem>
<para>
<function>oci_internal_debug</function> e seu alias <function>ociinternaldebug</function> foram
removidos.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.odbc">
<title>ODBC</title>
<itemizedlist>
<listitem>
<para>
<function>odbc_connect</function> não reutiliza mais conexões.
</para>
</listitem>
<listitem>
<para>
O parâmetro <parameter>flags</parameter> não usado de <function>odbc_exec</function> foi
removido.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.openssl">
<title>OpenSSL</title>
<itemizedlist>
<listitem>
<para>
<function>openssl_seal</function> e <function>openssl_open</function> agora requerem
<parameter>method</parameter> a ser passado, como o padrão anterior de <literal>"RC4"</literal>
é considerado inseguro.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.pcre">
<title>Expressões regulares (Compatíveis com Perl)</title>
<para>
Ao passar sequências de escape inválidas, elas não são mais interpretadas como literais. Esse comportamento
anteriormente exigia o modificador <literal>X</literal> que agora é ignorado.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.pdo">
<title>Objetos de dados do PHP</title>
<itemizedlist>
<listitem>
<para>
O modo padrão de manipulação de erro foi alterado de "silent" para "exceptions". Consulte
<link linkend="pdo.error-handling">Erros e manipulação de erros</link> para detalhes.
<!-- RFC: https://wiki.php.net/rfc/pdo_default_errmode -->
</para>
</listitem>
<listitem>
<para>
As assinaturas de alguns métodos PDO foram alteradas:
</para>
<para>
<simplelist>
<member><code>PDO::query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs)</code></member>
<member><code>PDOStatement::setFetchMode(int $mode, mixed ...$args)</code></member>
</simplelist>
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.pdo-odbc">
<title>PDO ODBC</title>
<para>
A diretiva
<link linkend="ini.pdo-odbc.db2-instance-name">pdo_odbc.db2_instance_name</link> do &php.ini;
foi removida.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.pdo-mysql">
<title>PDO MySQL</title>
<para>
<methodname>PDO::inTransaction</methodname> agora relata o estado real da transação da
conexão, em vez de uma aproximação mantida pelo PDO. Se uma consulta que é
sujeito para "confirmação implícita" é executado, <methodname>PDO::inTransaction</methodname>
posteriormente retornará &false;, pois uma transação não está mais ativa.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.pgsql">
<title>PostgreSQL</title>
<itemizedlist>
<listitem>
<para>
A sintaxe descontinuada de <function>pg_connect</function> usando vários parâmetros em vez de uma
string de conexão não é mais suportada.
</para>
</listitem>
<listitem>
<para>
As assinaturas descontinuadas de <function>pg_lo_import</function> e <function>pg_lo_export</function>
que passam a conexão como o último argumento não são mais suportadas. A conexão deve ser
passada como primeiro argumento.
</para>
</listitem>
<listitem>
<para>
<function>pg_fetch_all</function> agora retornará um array vazio em vez de &false; para resultado
conjuntos com zero linha.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.phar">
<title>Phar</title>
<para>
Os metadados associados a um phar não serão mais serializados automaticamente, para corrigir possíveis
vulnerabilidades de segurança devido à instanciação de objetos, carregamento automático etc.
<!-- RFC: https://wiki.php.net/rfc/phar_stop_autoloading_metadata -->
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.reflection">
<title>Reflection</title>
<itemizedlist>
<listitem>
<para>
As assinaturas do método
</para>
<para>
<simplelist>
<member><code>ReflectionClass::newInstance($args)</code></member>
<member><code>ReflectionFunction::invoke($args)</code></member>
<member><code>ReflectionMethod::invoke($object, $args)</code></member>
</simplelist>
</para>
<para>
foram alterados para:
</para>
<para>
<simplelist>
<member><code>ReflectionClass::newInstance(...$args)</code></member>
<member><code>ReflectionFunction::invoke(...$args)</code></member>
<member><code>ReflectionMethod::invoke($object, ...$args)</code></member>
</simplelist>
</para>
<para>
O código que deve ser compatível com PHP 7 e PHP 8 pode usar as seguintes
assinaturas para serem compatíveis com ambas as versões:
</para>
<para>
<simplelist>
<member><code>ReflectionClass::newInstance($arg = null, ...$args)</code></member>
<member><code>ReflectionFunction::invoke($arg = null, ...$args)</code></member>
<member><code>ReflectionMethod::invoke($object, $arg = null, ...$args)</code></member>
</simplelist>
</para>
</listitem>
<listitem>
<para>
O método <methodname>ReflectionType::__toString</methodname> agora retornará uma completa representação
de depuração do tipo, e não está mais descontinuada. Em particular, o resultado incluirá um
indicador de nulidade para tipos anuláveis. O formato do valor de retorno não é estável e pode
mudar entre as versões do PHP.
</para>
</listitem>
<listitem>
<para>
Métodos export() de reflexão foram removidos.
Em vez disso, os objetos de reflexão podem ser convertidos em string.
</para>
</listitem>
<listitem>
<para>
<methodname>ReflectionMethod::isConstructor</methodname> e
<methodname>ReflectionMethod::isDestructor</methodname> agora também retorna &true; por
<link linkend="object.construct">__construct()</link> e
<link linkend="object.destruct">__destruct()</link> métodos de interfaces.
Anteriormente, isso só seria verdade para métodos de classes e traits.
</para>
</listitem>
<listitem>
<para>
O método <methodname>ReflectionType::isBuiltin</methodname> foi movido para
<classname>ReflectionNamedType</classname>. <classname>ReflectionUnionType</classname> não
possui esse método.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.sockets">
<title>Sockets</title>
<itemizedlist>
<listitem>
<para>
As constantes descontinuadas <constant>AI_IDN_ALLOW_UNASSIGNED</constant> e
<constant>AI_IDN_USE_STD3_ASCII_RULES</constant> <parameter>flags</parameter> para
<function>socket_addrinfo_lookup</function> foram removidas.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.spl">
<title>Biblioteca PHP padrão (SPL)</title>
<itemizedlist>
<listitem>
<para>
<methodname>SplFileObject::fgetss</methodname> foi removido.
</para>
</listitem>
<listitem>
<para>
<methodname>SplFileObject::seek</methodname> agora sempre posiciona no começo da linha.
Anteriormente, posições <literal>&gt;=1</literal> resultavam no começo da linha seguinte.
</para>
</listitem>
<listitem>
<para>
<methodname>SplHeap::compare</methodname> agora especifica uma assinatura de método. Herdando classes,
implementar este método agora terá que usar uma assinatura de método compatível.
</para>
</listitem>
<listitem>
<para>
<methodname>SplDoublyLinkedList::push</methodname>,
<methodname>SplDoublyLinkedList::unshift</methodname> e
<methodname>SplQueue::enqueue</methodname> agora retornam <type>void</type> no lugar de &true;.
</para>
</listitem>
<listitem>
<para>
<function>spl_autoload_register</function> agora sempre lançará um
<classname>TypeError</classname> em argumentos inválidos, portanto, o segundo argumento
<parameter>do_throw</parameter> é ignorado e um aviso será emitido se for definido como &false;.
</para>
</listitem>
<listitem>
<para>
<classname>SplFixedArray</classname> agora é um <interfacename>IteratorAggregate</interfacename>
e não um <interfacename>Iterator</interfacename>.
<methodname>SplFixedArray::rewind</methodname>, <methodname>SplFixedArray::current</methodname>,
<methodname>SplFixedArray::key</methodname>, <methodname>SplFixedArray::next</methodname> e
<methodname>SplFixedArray::valid</methodname> foram removidos. Em seu lugar,
<methodname>SplFixedArray::getIterator</methodname> foi adicionado. Qualquer código que usa explicitamente
iteração sobre SplFixedArray agora deve obter um
<interfacename>Iterator</interfacename> até
<methodname>SplFixedArray::getIterator</methodname>. Isso significa que
<classname>SplFixedArray</classname> agora é seguro para uso em loops aninhados.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.standard">
<title>Biblioteca padrão</title>
<itemizedlist>
<listitem>
<para>
<function>assert</function> não avaliará mais argumentos de string, em vez disso, eles serão
tratados como qualquer outro argumento. <code>assert($a == $b)</code> deve ser usado em vez de
<code>assert('$a == $b')</code>. O <link
linkend="ini.assert.quiet-eval">assert.quiet_eval</link> diretiva ini e
as constantes <constant>ASSERT_QUIET_EVAL</constant> também foram removidas, pois não seriam mais
ter qualquer efeito.
</para>
</listitem>
<listitem>
<para>
<function>parse_str</function> não pode mais ser usado sem especificar um array de resultados.
</para>
</listitem>
<listitem>
<para>
O filtro <link linkend="filters.string.strip_tags">string.strip_tags</link> foi removido.
</para>
</listitem>
<listitem>
<para>
O argumento <parameter>needle</parameter> de <function>strpos</function>,
<function>strrpos</function>, <function>stripos</function>, <function>strripos</function>,
<function>strstr</function>, <function>strchr</function>, <function>strrchr</function> e
<function>stristr</function> agora sempre será interpretado como uma string. Anteriormente agulhas não-string
foram interpretadas como um ponto de código ASCII. Uma chamada explícita para <function>chr</function> pode
ser usado para restaurar o comportamento anterior.
</para>
</listitem>
<listitem>
<para>
O argumento <parameter>needle</parameter> para <function>strpos</function>,
<function>strrpos</function>, <function>stripos</function>, <function>strripos</function>,
<function>strstr</function>, <function>stristr</function> e <function>strrchr</function> podem
agora estar vazios.
</para>
</listitem>
<listitem>
<para>
O argumento <parameter>length</parameter> para <function>substr</function>,
<function>substr_count</function>, <function>substr_compare</function> e
<function>iconv_substr</function> agora pode ser &null;. &null; os valores se comportarão como se não houvesse
argumento de comprimento fornecido e, portanto, retornará o restante da string em vez de uma string
vazia.
</para>
</listitem>
<listitem>
<para>
O argumento <parameter>length</parameter> para <function>array_splice</function> agora pode ser
&null;. &null; os valores se comportarão de forma idêntica à omissão do argumento, removendo assim tudo
do <parameter>offset</parameter> até o final do array.
</para>
</listitem>
<listitem>
<para>
O argumento <parameter>args</parameter> de <function>vsprintf</function>,
<function>vfprintf</function> e <function>vprintf</function> agora devem ser um array. Anteriormente
qualquer tipo era aceito.
</para>
</listitem>
<listitem>
<para>
A opção <literal>'salt'</literal> de <function>password_hash</function> não é mais
suportado. Se a opção <literal>'salt'</literal> for usada, um aviso será gerado, o
salt é ignorado e um salt gerado é usado em seu lugar.
</para>
</listitem>
<listitem>
<para>
A função <function>quotemeta</function> agora retornará uma string vazia se uma string vazia
foi passada. Anteriormente &false; era devolvido.
</para>
</listitem>
<listitem>
<para>
As seguintes funções foram removidas.
</para>
<para>
<simplelist>
<member><function>hebrevc</function></member>
<member><function>convert_cyr_string</function></member>
<member><function>money_format</function></member>
<member><function>ezmlm_hash</function></member>
<member><function>restore_include_path</function></member>
<member><function>get_magic_quotes_gpc</function></member>
<member><function>get_magic_quotes_runtime</function></member>
<member><function>fgetss</function></member>
</simplelist>
</para>
</listitem>
<listitem>
<para>
<constant>FILTER_SANITIZE_MAGIC_QUOTES</constant> foi removida.
</para>
</listitem>
<listitem>
<para>
Chamar <function>implode</function> com parâmetros na ordem inversa <code>($pieces,
$glue)</code> não é mais suportado.
</para>
</listitem>
<listitem>
<para>
<function>parse_url</function> agora distinguirá consultas e fragmentos ausentes e vazios:
</para>
<para>
<simplelist>
<member><code>http://example.com/foo → query = null, fragment = null</code></member>
<member><code>http://example.com/foo? → query = "", fragment = null</code></member>
<member><code>http://example.com/foo# → query = null, fragment = ""</code></member>
<member><code>http://example.com/foo?# → query = "", fragment = ""</code></member>
</simplelist>
Anteriormente, todos os casos resultavam em consultas e fragmentos &null;.
</para>
</listitem>
<listitem>
<para>
<function>var_dump</function> e <function>debug_zval_dump</function> agora serão
números de ponto flutuante usando <link linkend="ini.serialize-precision">serialize_precision</link>
em vez de <link linkend="ini.precision">precisão</link>. Em uma configuração padrão, isto
significa que os números de ponto flutuante agora são impressos com total precisão por essas funções
depuradoras.
</para>
</listitem>
<listitem>
<para>
Se o array retornado por <link linkend="object.sleep">__sleep()</link> contiver propriedades
inexistentes, estas agora são silenciosamente ignoradas. Anteriormente, tais propriedades teriam sido
serializadas como se tivessem o valor &null;.
</para>
</listitem>
<listitem>
<para>
A localidade padrão na inicialização agora é sempre <literal>"C"</literal>. Nenhuma localidade é herdada do
ambiente por padrão. Anteriormente, <constant>LC_ALL</constant> era definida como
<literal>"C"</literal>, enquanto <constant>LC_CTYPE</constant> era herdada do ambiente.
No entanto, algumas funções não respeitavam a localidade herdada sem uma chamada
explícita <function>setlocale</function>. Uma chamada <function>setlocale</function> explícita agora é
sempre necessária se um componente de localidade deve ser alterado do padrão.
</para>
</listitem>
<listitem>
<para>
O fallback DES descontinuado em <function>crypt</function> foi removido. Se um desconhecido formato salt
for passado para <function>crypt</function>, a função falhará com <literal>*0</literal>
em vez de voltar para um hash DES fraco agora.
</para>
</listitem>
<listitem>
<para>
A especificação de rodadas fora do intervalo para SHA256/SHA512 <function>crypt</function> agora falhará com
<literal>*0</literal> em vez de fixar no limite mais próximo. Isso corresponde ao comportamento da glibc.
</para>
</listitem>
<listitem>
<para>
O resultado das funções de classificação pode ter mudado, se o array contiver elementos que comparam como
igual.
</para>
</listitem>
<listitem>
<para>
Quaisquer funções que aceitam retornos de chamada que não são explicitamente especificados para aceitar parâmetros por
referência agora avisará se um retorno de chamada com parâmetros de referência for usado. Exemplos incluem
<function>array_filter</function> e <function>array_reduce</function>. Este já era o
caso para a maioria, mas não para todas as funções anteriormente.
</para>
</listitem>
<listitem>
<para>
O empacotador de fluxo HTTP usado por funções como <function>file_get_contents</function>
agora anuncia HTTP/1.1 em vez de HTTP/1.0 por padrão. Isso não muda o comportamento do
cliente, mas pode fazer com que os servidores respondam de forma diferente. Para manter o comportamento antigo, defina a
opção de contexto de fluxo <literal>'protocol_version'</literal>, por exemplo
</para>
<para>
<programlisting role="php">
<![CDATA[
<?php
$ctx = stream_context_create(['http' => ['protocol_version' => '1.0']]);
echo file_get_contents('http://example.org', false, $ctx);
?>
]]>
</programlisting>
</para>
</listitem>
<listitem>
<para>
Chamar <function>crypt</function> sem um salt explícito não é mais suportado. Se você
gostaria de produzir um hash forte com salt gerado automaticamente, use
<function>password_hash</function> em vez disso.
</para>
</listitem>
<listitem>
<para>
<function>substr</function>, <function>mb_substr</function>, <function>iconv_substr</function> e
<function>grapheme_substr</function> agora fixa consistentemente os deslocamentos fora dos limites à string
fronteira. Anteriormente, &false; era retornado em vez da string vazia em alguns casos.
</para>
</listitem>
<listitem>
<para>
No Windows, as funções de execução do programa (<function>proc_open</function>, <function>exec</function>,
<function>popen</function> etc.) usando o shell, agora execute consistentemente <command>%comspec% /s
/c "$commandline"</command>, que tem o mesmo efeito que executar
<command>$commandline</command> (sem aspas adicionais).
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.sysvsem">
<title>Sysvsem</title>
<itemizedlist>
<listitem>
<para>
O parâmetro <parameter>auto_release</parameter> de <function>sem_get</function> foi alterado para
aceitar valores booleanos em vez de int.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.tidy">
<title>Tidy</title>
<itemizedlist>
<listitem>
<para>
O parâmetro <parameter>use_include_path</parameter>, que não era usado internamente, foi
removido de <function>tidy_repair_string</function>.
</para>
</listitem>
<listitem>
<para>
<methodname>tidy::repairString</methodname> e <methodname>tidy::repairFile</methodname> se tornaram
métodos estáticos.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.tokenizer">
<title>Tokenizer</title>
<itemizedlist>
<listitem>
<para>
Tokens <constant>T_COMMENT</constant> não incluirão mais uma quebra de linha à direita. Em vez disso, a quebra de linha será
parte de um token <constant>T_WHITESPACE</constant> seguinte. Deve-se notar que
<constant>T_COMMENT</constant> nem sempre é seguido de espaço em branco, Ele também pode ser seguido de
<constant>T_CLOSE_TAG</constant> ou o fim do arquivo (end-of-file).
</para>
</listitem>
<listitem>
<para>
Nomes com agora são representados usando os tokens <constant>T_NAME_QUALIFIED</constant>
(<code>Foo\Bar</code>), <constant>T_NAME_FULLY_QUALIFIED</constant> (<code>\Foo\Bar</code>) e
<constant>T_NAME_RELATIVE</constant> (<code>namespace\Foo\Bar</code>).
<constant>T_NS_SEPARATOR</constant> é usado apenas para separadores de namespace independentes, e só é sintaticamente
válido em conjuncão com declarações de uso de grupo.
<!-- RFC: https://wiki.php.net/rfc/namespaced_names_as_token -->
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.xmlreader">
<title>XMLReader</title>
<para>
<methodname>XMLReader::open</methodname> e <methodname>XMLReader::XML</methodname> agora são
métodos estáticos. Eles ainda podem ser chamados como métodos de instância, mas classes herdadas precisam declará-los
como estáticos se elas sobrescrevem esses métodos.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.xmlrpc">
<title>XML-RPC</title>
<para>
A extensão XML-RPC foi movida para PECL e não é mais parte da distribuição
PHP.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.zip">
<title>Zip</title>
<para>
<constant>ZipArchive::OPSYS_Z_CPM</constant> foi removida (esse nome era um erro de digitação). Em vez dela,
use <constant>ZipArchive::OPSYS_CPM</constant>.
</para>
</sect2>
<sect2 xml:id="migration80.incompatible.zlib">
<title>Zlib</title>
<itemizedlist>
<listitem>
<para>
<function>gzgetss</function> foi removida.
</para>
</listitem>
<listitem>
<para>
<link linkend="ini.zlib.output-compression">zlib.output_compression</link> não é mais
desabilitado automaticamente para o <literal>Content-Type: image/*</literal>.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="migration80.incompatible.php-test-packs">
<title>Pacotes de teste para PHP no Windows</title>
<para>
O executor de testes foi renomeado de <filename>run-test.php</filename> para
<filename>run-tests.php</filename>, para coincidir com seu nome em php-src.
</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
-->