O que há de novo no PHP 7.4

O PHP 7.4 será lançado em 28 de novembro de 2019. Seus recursos incluem:

  • Arrow functions para cleaner one-liner functions
  • Preloading para melhorar o desempenho
  • Typed properties nas classes
  • Variação de tipo aprimorada
  • O operador null de atribuição de coalescência como abreviação
  • FFI para melhor desenvolvimento de extensão em PHP
  • Underscores podem ser usados para formatar valores numéricos
  • Spread operator em arrays
  • E mais, você pode ler sobre isso aqui

Novas características


O PHP 7.4 vem com uma quantidade notável de novos recursos. Começaremos com uma lista de todos os novos recursos e, depois, examinaremos as alterações e descontinuações.

Uma observação antes de nos aprofundarmos: se você ainda estiver em uma versão inferior do PHP, também desejará ler as novidades do PHP 7.3.

Arrow functions rfc


As Arrow functions, também chamadas de “short closures”, permitem funções de uma linha menos detalhadas.

Enquanto você escrevia isso anteriormente:

array_map(function (User $user) { 
    return $user->id; 
}, $users)

Agora você pode escrever isso:

array_map(fn (User $user) => $user->id, $users)

Existem algumas notas sobre as arrow functions:

  • Eles sempre podem acessar o escopo pai, não há necessidade da palavra-chave.
  • $this está disponível como closures normais.
  • As arrow functions podem conter apenas uma linha, que também é a declaração de retorno.
  • Você pode ler sobre eles em profundidade aqui.

Typed properties rfc

Variáveis de classe podem ser sugeridas por tipo:

class A
{
    public string $name;
    
    public ?Foo $foo;
}

Há muito o que contar sobre esse recurso, então escrevi um post dedicado sobre eles.

Improved type variance rfc

Eu também escrevi sobre o sistema de tipos do PHP no passado, então é bom ver algumas melhorias realmente chegando ao núcleo do PHP.

A variação de tipo é outro tópico que vale o seu próprio post no blog, mas, resumindo: você poderá usar tipos de retorno covariantes –

class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    { /* … */ }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    { /* … */ }

— e argumentos contrários.

class A
{
    public function contraVariantArguments(ChildType $type)
    { /* … */ }
}

class B extends A
{
    public function contraVariantArguments(ParentType $type)
    { /* … */ }
}

Operador null de atribuição coalescente rfc

Em seguida, é o operador null de atribuição de coalescência, uma abreviação para operações de coalescência nula. Em vez de fazer isso:

$data['date'] = $data['date'] ?? new DateTime();

Você consegue fazer isso:

$data['date'] ??= new DateTime();

Array spread operator  RFC

Em seguida, agora é possível usar o spread operator em arrays:

$arrayA = [1, 2, 3];

$arrayB = [4, 5];

$result = [0, ...$arrayA, ...$arrayB, 6 ,7];

// [0, 1, 2, 3, 4, 5, 6, 7]

Observe que isso funciona apenas em arrays com chaves numéricas

Separador Literal Numérico RFC

O PHP 7.4 permite sublinhados a serem usados para separar visualmente valores numéricos. Se parece com isso:

$unformattedNumber = 107925284.88;

$formattedNumber = 107_925_284.88;

Os sublinhados são simplesmente ignorados pela engine.

Interface de função externa rfc

Passando para alguns recursos mais básicos: interface de função estrangeira ou “FFI”, em resumo, permite chamar o código C da terra do usuário. Isso significa que as extensões PHP podem ser escritas em PHP puro e carregadas via composer.

Note-se, porém, que este é um tópico complexo. Você ainda precisa de conhecimento de C para poder usar corretamente esse recurso.

Preloading rfc

Outro recurso de nível inferior é o pré-carregamento. É uma adição incrível ao núcleo do PHP, o que pode resultar em algumas melhorias significativas de desempenho.

Resumindo: se você estiver usando uma estrutura, seus arquivos deverão ser carregados e vinculados a cada solicitação. O pré-carregamento permite ao servidor carregar arquivos PHP na memória na inicialização e tê-los permanentemente disponíveis para todas as solicitações subsequentes.

Obviamente, o ganho de desempenho tem um custo: se a origem dos arquivos pré-carregados for alterada, o servidor deverá ser reiniciado.

você quer saber mais? Eu escrevi um post dedicado sobre pré-carregamento aqui.

Serialização de objetos personalizados rfc

Dois novos métodos mágicos foram adicionados: __serialize e __unserialize. A diferença entre esses métodos e __sleep e __wakeup é discutida no RFC.

Reflection for references rfc

Bibliotecas como o var dumper do Symfony dependem muito da reflection API para despejar com segurança uma variável. Anteriormente, não era possível refletir adequadamente as referências, resultando nessas bibliotecas contando com hacks para detectá-las.

O PHP 7.4 adiciona a classe ReflectionReference que resolve esse problema.

Weak references rfc

Weak references são referências a objetos, que não os impedem de serem destruídos.

mb_str_split added RFC

Essa função fornece a mesma funcionalidade que str_split, mas em seqüências de vários bytes.

Password Hashing Registry RFC

Mudanças internas foram feitas na maneira como as bibliotecas de hash são usadas, para que seja mais fácil para o usuário usá-las.

Mais especificamente, uma nova função password_algos foi adicionada, retornando uma lista de todos os algoritmos de senha registrados.

Mudanças e depreciações

Além de novos recursos, também há muitas alterações no linguagem. A maioria dessas alterações é non-breaking, embora algumas possam afetar suas bases de código.

Observe que os avisos de descontinuação não são por “breaking” de definição, mas apenas um aviso ao desenvolvedor de que a funcionalidade será removida ou alterada no futuro. Seria bom não ignorar os avisos de depreciação e corrigi-los imediatamente; pois facilitará o caminho de atualização para o PHP 8.0.

Desaprovação do operador ternário associativo à esquerda RFC

O operador ternário tem algumas peculiaridades estranhas no PHP. Este RFC adiciona um aviso de descontinuação para instruções ternárias aninhadas. No PHP 8, essa depreciação será convertida em um erro de tempo de compilação.

1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok

Exceções permitidas no __toString RFC

Anteriormente, as exceções não podiam ser lançadas em __toString. Eles foram proibidos devido a uma solução alternativa para alguns mecanismos antigos de tratamento de erros principais, mas Nikita apontou que essa “solução” não resolveu o problema que tentava resolver.

Esse comportamento agora foi alterado e exceções podem ser lançadas de __toString.

Precedência de concatenação RFC

Se você escrever algo assim:

echo "sum: " . $a + $b;

O PHP anteriormente o interpretaria assim:

echo ("sum: " . $a) + $b;

O PHP 8 fará com que seja interpretado assim:

echo "sum :" . ($a + $b);

O PHP 7.4 adiciona um aviso de descontinuação ao encontrar uma expressão sem parênteses contendo a . antes de um sinal de + ou -.

array_merge sem argumentos UPGRADING

Desde a adição do operador spread, pode haver casos em que você queira usar array_merge assim:

$merged = array_merge(...$arrayOfArrays);

Para suportar o edge case em que $arrayOfArrays estaria vazio, array_merge e array_merge_recursive agora permitem uma lista de parâmetros vazia. Um array vazio será retornado se nenhuma entrada for passada.

Colchetes para acesso de array e string  RFC

Foi possível acessar arrays e deslocamentos de string usando colchetes:

$array{1};
$string{3};

Isso foi depreciado.

Aviso de acesso inválido à array RFC

Se você usar a sintaxe de acesso à array em, digamos, um número inteiro; O PHP retornaria anteriormente nulo. A partir do PHP 7.4, um aviso será emitido.

$i = 1;

$i[0]; // Notice

proc_open improvements UPGRADING

Foram efetuadas alterações no proc_open para que ele possa executar programas sem passar por um shell. Isso é feito passando uma array em vez de uma string para o comando.

strip_tags também aceita arrays UPGRADING

Você costumava retirar apenas várias tags da seguinte maneira:

strip_tags($string, '<a><p>')

O PHP 7.4 também permite o uso de um array:

strip_tags($string, ['a', 'p'])

ext-hash sempre ativado rfc

Esta extensão está agora permanentemente disponível em todas as instalações PHP.

Aprimoramentos para password_hash rfc

Esta é uma pequena mudança e adiciona suporte a hash argon2i e argon2id quando o PHP foi compilado sem libargon.

PEAR não ativado por padrão EXTERNALS

Como o PEAR não é mais mantido ativamente, a equipe principal decidiu remover sua instalação padrão com o PHP 7.4.

Várias pequenas depreciações RFC

Essa RFC agrupa muitas pequenas depreciações, cada uma com seu próprio voto. Certifique-se de ler uma explicação mais detalhada na página RFC, mas aqui está uma lista de itens obsoletos:

  • The real type
  • Magic quotes legacy
  • array_key_exists() with objects
  • FILTER_SANITIZE_MAGIC_QUOTES filter
  • Reflection export() methods
  • mb_strrpos() with encoding as 3rd argument
  • implode() parameter order mix
  • Unbinding $this from non-static closures
  • hebrevc() function
  • convert_cyr_string() function
  • money_format() function
  • ezmlm_hash() function
  • restore_include_path() function
  • allow_url_include ini directive

Outras alterações UPGRADING

Você deve sempre dar uma olhada no documento UPGRADING completo ao atualizar as versões do PHP.

Aqui estão algumas alterações destacadas:

  • Calling parent:: em uma classe sem pai é depreciado.
  • Calling var_dump em um DateTime ou DateTimeImmutable instance não deixará mais propriedades acessíveis no objeto.
  • openssl_random_pseudo_bytes lançará uma exceção em situações de erro..
  • Tentar serializar um PDO ou PDOStatement instance gerará uma Exception em vez de uma PDOException.
  • Calling get_object_vars() on an ArrayObject instance wetornará as propriedades do próprio ArrayObject, e não os valores da matriz ou do objeto agrupado. Observe que as conversões (array) não são afetadas.
  • ext/wwdx foi depreciado.

RFC Melhorias no processo de votação

Tecnicamente, isso não é uma atualização relacionada ao PHP 7.4, mas vale a pena mencionar: as regras de votação para as RFCs foram alteradas.

  • Eles sempre precisam de uma maioria de 2/3 para passar.
  • Não há períodos de votação mais curtos, todas as RFCs devem estar abertas por pelo menos 2 semanas.

Espere agora …

Se você chegou até aqui, é provável que esteja interessado em PHP. Talvez você também esteja interessado em ler nosso conteúdos? Aqui estão algumas das coisas que escrevemos.

Ah, e por último, siga-nos nas Redes Sociais se você quiser se manter atualizado!


Autor: Brent 

TEXTO ORIGINAL

Obrigado por enviar o seu comentário minha jóia!