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:
- Tempo de execução
- Memória necessária
- 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.
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:
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.