Embora a nova versão do PHP seja pequena, ela já traz muitos recursos interessantes, sem exagero, tanto para a sintaxe da linguagem quanto para o seu desempenho. A lista de inovações não é final, mas as principais alterações já foram feitas e aceitas. O lançamento está agendado para dezembro de 2019.

Principais alterações para a próxima versão:
- Propriedades da classe digitada
- Pré-carregamento para melhor desempenho
- Funções de seta para escrita curta de funções anônimas
- Atribuindo operador de união com nulo (?? =)
- Covariância / contravariância nas assinaturas de métodos herdados
- Uma interface de função externa que abre novas possibilidades para o desenvolvimento de extensões em PHP
- Desembalando o operador em matrizes
Leia mais sobre essas e outras mudanças no âmbito do gato.
Isenção de responsabilidade: Várias vezes em minhas discussões com colegas, destaque o artigo de Brent “ New in PHP 7.4 ”. No começo, eu queria fazer uma tradução, mas, no processo, percebi que nem todas as atualizações mais recentes são indicadas no texto e existem algumas imprecisões, portanto, este artigo apareceu em vez da tradução.Funções de seta ( RFC )
As funções de seta permitem que você faça um registro mais curto de funções anônimas:
array_map(function (User $user) { return $user->id; }, $users) array_map(fn(User $user) => $user->id, $users)
Alguns recursos da implementação adotada das funções de seta:
- Eles podem acessar o escopo
parent
, portanto, não há necessidade de usar a palavra-chave use. $this
também $this
disponível, como em funções anônimas regulares.- As funções de seta podem conter apenas uma linha, que também é um operador de retorno.
Você pode ler mais sobre eles neste
artigo sobre Habr.
Propriedades digitadas ( RFC )
Viva! As propriedades da classe agora podem ter dica de tipo. Esta é uma mudança muito esperada desde o PHP 7, para uma digitação mais forte da linguagem. Agora, temos todos os recursos básicos para digitação forte. Todos os tipos estão disponíveis para digitação, exceto
void
e que
callable.
ser
callable.
class Bar { public string $name; public ?int $amount; public Foo $foo; }
Se você quiser que eu considere com mais detalhes as novas possibilidades de digitar as propriedades dos objetos, observe nos comentários e escreverei um artigo separado sobre eles!
Atribuir operador de associação nula ( RFC )
Em vez de uma entrada tão longa:
$data['date'] = $data['date'] ?? new DateTime();
Agora será possível escrever assim:
$data['date'] ??= new DateTime();
Operador de desembalagem da matriz ( RFC )
Agora você pode usar o operador descompactar em matrizes:
$arrayA = [1, 2, 3]; $arrayB = [4, 5]; $result = [0, ...$arrayA, ...$arrayB, 6 ,7]; <i>// [0, 1, 2, 3, 4, 5, 6, 7]</i>
Observe que isso funciona apenas com matrizes não associativas.
Interface de função externa ( RFC )
A interface de função externa (FFI) permite escrever o código C diretamente no código PHP. Isso significa que as extensões PHP podem ser escritas em PHP puro.
Note-se que este é um tópico complexo. Você ainda precisa ter conhecimento de C para usar esses recursos corretamente.
Pré-carregamento ( RFC )
O pré-carregamento é uma excelente adição ao núcleo do PHP, o que deve levar a algumas melhorias significativas de desempenho.
Por exemplo, se você usar a estrutura, seus arquivos deverão ser baixados e recompilados para cada solicitação. Ao usar o opcache, na primeira vez em que esses arquivos participam do processamento de uma solicitação e, a cada vez, são verificados com êxito por alterações. O pré-carregamento permite ao servidor carregar os arquivos PHP especificados na memória na inicialização e disponibilizá-los constantemente para todas as solicitações subsequentes, sem verificações adicionais para alterações de arquivos.
O aprimoramento do desempenho é "não gratuito" - se os arquivos pré-carregados forem modificados, o servidor deverá ser reiniciado.
Covariância / contravariância em assinaturas de método legado ( RFCs )
Atualmente, o PHP tem tipos de parâmetros invariantes e tipos de retorno invariantes. Essa alteração permite alterar o tipo do parâmetro para um de seus supertipos. Por sua vez, o tipo retornado pode ser substituído por seu subtipo. Assim, essa mudança permitirá seguir mais rigorosamente o princípio da substituição Barbara Liskov.
Um exemplo de uso de um tipo de retorno covariante:
interface Factory { function make(): object; } class UserFactory implements Factory { function make(): User; }
e argumento contravariante:
interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { function concat(iterable $input) {/* . . . */} }
Serialização de objetos personalizados ( RFC )
Dois novos métodos mágicos ficam disponíveis:
__serialize
e
__unserialize
. Esse mecanismo de serialização combina a versatilidade da interface
Serializable
com a abordagem da implementação de métodos de
__sleep/__wakeup
. Mais detalhes sobre suas diferenças podem ser encontrados na RFC.
Prioridade de concatenação ( RFC )
Se você escreveu algo parecido com isto:
echo "sum: " . $a + $b;
O PHP agora interpretaria isso como:
echo ("sum: " . $a) + $b;
O PHP 8 interpretará isso de maneira diferente:
echo "sum :" . ($a + $b);
O PHP 7.4 adiciona um aviso de obsolescência ao detectar uma expressão contendo "." antes do "+" ou "-" e não entre colchetes.
__toString
exceção __toString
( RFC )
Anteriormente, não era possível lançar exceções do método mágico
__toString
. A justificativa para esse comportamento é que a conversão de objetos em seqüências de caracteres é realizada em muitas funções da biblioteca padrão e nem todos estão prontos para "processar" as exceções corretamente. Como parte desse RFC, foi realizada uma auditoria abrangente das conversões de cadeias de caracteres na base de código, e agora essa restrição pode ser removida, o que foi feito.
Reflexão de link ( RFC )
Bibliotecas, como o
symfony/var-dumper
, dependem muito do
ReflectionAPI
para exibir com precisão as variáveis. Anteriormente, não havia suporte adequado para a reflexão de links, o que obrigava essas bibliotecas a depender de hacks para detectar links. O PHP 7.4 adiciona uma classe
ReflectionReference
que resolve esse problema.
Adicionado o método mb_str_split
( RFC )
Essa função fornece a mesma funcionalidade que
str_split
, mas para strings escritas em codificações multibyte.
Sempre disponível ext-hash
extension ( RFC )
Esta extensão está agora constantemente disponível em todas as instalações PHP.
O PEAR não está ativado por padrão ( EXTERNOS )
O PEAR não é mais suportado ativamente, a equipe principal decidiu removê-lo da instalação padrão com o PHP 7.4.
Registro de algoritmo de hash de senha ( RFC )
Uma nova função
password_algos
foi adicionada, que retorna uma lista de todos os algoritmos de hash de senha registrados.
Links Fracos ( RFC )
Links fracos permitem salvar um link em um objeto que não impede a destruição desse objeto. Por exemplo, eles são úteis para implementar estruturas semelhantes a cache.
Delimitador literal numérico ( RFC )
A ausência de separadores visuais em grupos de dígitos aumentou o tempo de leitura e depuração do código e pode levar a erros não intencionais. Agora foi adicionado suporte ao caractere sublinhado em literais numéricos para separar visualmente grupos de números.
1_000_000_000 // int 6.674_083e-11; // float 299_792_458; // decimal 0xCAFE_F00D; // hexadecimal 0b0101_1111; // binary 0137_041; // octal
Tags abertas curtas preteridas ( RFC )
Etiqueta de abertura curta
<?
está obsoleto e será removido no PHP 8. A tag curta
<?= (echo)
não
<?= (echo)
afetada.
Operador ternário associativo de esquerda recusado ( RFC )
O operador ternário tem algumas peculiaridades estranhas no PHP. Esse RFC descontinua operadores ternários aninhados.
1 ? 2 : 3 ? 4 : 5; // deprecated (1 ? 2 : 3) ? 4 : 5; // ok
No PHP 8, esse registro resultará em um erro no nível da compilação.
Alterações incompatíveis com versões anteriores ( UPGRADING )
Aqui estão algumas das alterações incompatíveis com versões anteriores mais importantes:
- Uma chamada para
parent::
em uma classe sem pai é preterida. - Chamar
var_dump
em uma instância de DateTime
ou DateTimeImmutable
não disponibiliza mais as propriedades do objeto. openssl_random_pseudo_bytes
lançará uma exceção em situações de erro causadas pela biblioteca OpenSSL. Anteriormente, ele retornava false, o que poderia levar à geração de uma string vazia.- A tentativa de serializar uma
PDO
ou uma instância de uma PDOStatement
lança uma Exception
vez de uma PDOException
. - Chamar
get_object_vars()
em uma instância ArrayObject
retornará as propriedades do próprio ArrayObject
, não o valor da matriz agrupada. Para obter valores de matriz agrupados como antes, ArrayObject
no tipo de array
.