Novo no PHP 7.4

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 .

Source: https://habr.com/ru/post/pt454410/


All Articles