Back-End

14 dez, 2017

PHP 7.2: quais são as novidades da nova versão do PHP

Publicidade

2015 foi um ano importante para o PHP, afinal, somente onze anos após a sua versão 5.0, uma nova versão principal foi finalmente lançada! O PHP 7 trouxe muitos novos recursos de linguagem e um impressionante ganho de desempenho. Mas não parou por aí, em dezembro de 2016 foi lançada a mais recente versão, a 7.1, que é a que temos disponível atualmente.

O PHP agora está se concentrando em recursos de linguagem que ajudarão a todos a escrever um código melhor. Neste ano, em novembro, tivemos o lançamento da versão 7.2 (mais detalhes sobre o calendário de lançamento e todas as atualizações  podem ser vistos na RFC e no UPGRADE NOTES).

Neste artigo, vou falar um pouco sobre as principais mudanças propostas para esta nova versão.

O que se tornará obsoleto no PHP 7.2

A RFC Deprecations for PHP 7.2 mostra algumas funcionalidades, no qual o uso será desencorajado, pois serão retiradas ou substituídas no PHP. Conforme RFC estas funcionalidades deverão ser removidas o mais tardar na versão 8.0.

Abaixo algumas das funcionalidades que se tornarão obsoletas:

  • __autoload
  • $php_errormsg
  • create_function()
  • func_overload
  • (unset) cast
  • parse_str() without second argument
  • gmp_random()
  • each()
  • assert() with string argument
  • $errcontext argument of error handler

Principais novidades que entrarão no PHP 7.2

O PHP 7.2 foi oficialmente lançado em novembro deste ano e trouxe diversas novidades. Algumas das principais:

  • get_class() desabilita o parâmetro nulo
  • Impedir number_format() de retornar zero negativo
  • Argon2 Password Hash
  • Object typehint
  • libsodium

Todos os outros RFC’s aprovados, que estão sendo implementados na versão 7.2, você poderá ver aqui.

Abaixo veremos algumas dessas novidades e pequenos exemplos com código.

get_class() desabilita o parâmetro nulo

Quando null é passado como parâmetro para get_class() dentro de um contexto de classe, o comportamento da função pode ser altamente surpreendente:

class Foo
{
    function bar($repository)
    {
        $result = $repository->find(100);
 
        echo get_class($result);
    }
}

Se o $result contiver um objeto válido, o resultado será o retorno do nome da classe conforme objeto passado. Se o $result for nulo, a saída será do contexto da classe em que get_class() foi chamado, neste caso “Foo”.

Esta característica viola o princípio de POLA (Principle of least astonishment): “se uma característica necessária tiver um alto fator de espanto, talvez seja necessário redesenhar o recurso”. Esta RFC propõe permitir que null seja passado para a função como um parâmetro válido. Se get_class() for chamado com null como parâmetro, um aviso será emitido:

Warning: get_class() expects parameter 1 to be object, null given in %s on line %d

Impedir number_format() de retornar zero negativo

Hoje, ao executar number_format(-0.00), retorna a string (1) “0”. No entanto, ao executar number_format(-0.01), retorna a string (2) “-0”.

Este RFC propõe manter number_format() consistente e não exibir o sinal quando um número é arredondado para zero.

Argon2 Password Hash

Argon2 é o algoritmo de hashing de senha vencedor do concurso “Password Hashing Competition” de 2015, sendo assim muito bem recomendado a sua utilização. Ao contrário do Bcrypt, que apenas possui um único fator de custo, o Argon2 é parametrizado por três fatores distintos:

  1. Tempo de execução
  2. Memória necessária
  3. Grau de paralelismo

Esta RFC propõe a implementação do Argon2i (v1.3) nas funções password_ * para uso como uma alternativa segura ao Bcrypt.

A função password_hash() é alterada para aceitar PASSWORD_ARGON2I como o algoritmo e aceitar o custo da memória, o custo do tempo e o grau de paralelismo como opções. O exemplo a seguir ilustram a nova funcionalidade:

// Argon2i com fatores de custo padrão
password_hash('password', PASSWORD_ARGON2I);
 
// Argon2i com fatores de custo personalizados
password_hash('password', PASSWORD_ARGON2I, ['memory_cost' => 1<<17, 'time_cost' => 4, 'threads' => 2]);

Object typehint

O PHP 7 introduziu tipos escalares para parâmetros e também para declarar tipos de retorno de funções.

No entanto, atualmente não é possível declarar que uma função precisa receber um object como parâmetro ou declarar que uma função deve retornar um object.

Este RFC propõe que o object possa ser usado como um tipo de parâmetro e como um tipo de retorno. Qualquer objeto passaria na verificação de tipo.

Exemplo:

Tipo de parâmetro:

function acceptsObject(object $obj) {
    ...
}
 
// Este código será analisado estaticamente e está correto
acceptsObject(json_decode('{}'));
 
// Este código será analisado estaticamente e está correto
acceptsObject(new \MyObject());
 
// Aqui será analisado estaticamente e contém erro
// e lançaria um TypeError em tempo de execução
acceptsObject("Ceci n'est pas une object.");

Tipo de retorno:

// Esta função será analisada estaticamente de acordo com o
// tipo retornado
function correctFunction() : object {
    $obj = json_decode('{}');
 
    return $obj;
}
 
// Esta função será analisada estaticamente e contém erro
// que resultará em falha em tempo de execução
function errorFunction() : object {
    return [];
}

A primeira linguagem de programação a adotar criptografia moderna

Outra novidade que veio na versão 7.2 é referente à criptografia moderna, libsodium, que é parte da extensão principal do PHP 7.2.  Sodium é uma biblioteca que facilita a utilização de criptografia, descriptografia, assinaturas, hash de senha e muito mais. Seu objetivo é fornecer todas as operações básicas necessárias para criar ferramentas criptográficas de alto nível. Mais informações podem ser encontradas na RFC de adição da libsodium no PHP 7.2.

Fonte: https://github.com/jedisct1/libsodium

Concluindo

Conforme dados do packagist.org, a adoção da versão 7 do PHP já superou a 5.6, como podemos ver no comparativo abaixo, que foi feito com base em dados de novembro de 2016 e maio de 2017:

Fonte: https://seld.be/notes/php-versions-stats-2017-1-edition

Você ainda não está utilizando PHP 7? O que está impedindo você de fazer a atualização? Na KingHost nós utilizamos em todos os novos projetos e tentamos atualizar para a versão 7 os projetos antigos sempre que possível.

E os clientes  KingHost também podem usar. Fomos a primeira empresa de hospedagem do Brasil a disponibilizar suporte ao PHP 7.2, no mesmo dia em que a comunidade liberou.

Na página dos RFC’s você encontra a documentação completa de todas as features, inclusive com exemplos. Essa versão, claro, não se limita apenas a novas features. Vale muito a pena olhar cada item alterado.

Já posso testar esta nova versão? Sim, já está disponível o Release Candidate 5 Released. Você já pode ver quais alterações entrarão nessa nova versão e testar.

Podemos usar Docker para testar facilmente, usando as imagens oficiais do PHP disponível no Docker Hub: PHP 7.2.0 Release Candidate.

Isso é tudo por enquanto, mas se você se deparar com outras mudanças que não são mencionadas aqui, deixe um comentário abaixo. Obrigado pela leitura.