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, no mês de novembro, teremos 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 cujo uso será desencorajado, pois serão retiradas ou substituídas no PHP. Conforme a 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()
mbstring.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 será oficialmente lançado em novembro de 2017 e trará consigo 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, e que estão sendo implementados na versão 7.2, você pode 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:
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 virá do contexto da classe na qual 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 tendo 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)
, o retorno é a string (1) “0”. No entanto, ao executar number_format(-0.01)
, o retorno é 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 sua utilização muito bem recomendada. 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 algoritmo e aceitar o custo da memória, o custo do tempo e o grau de paralelismo como opções. O exemplo a seguir ilustra a nova funcionalidade.
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:
Tipo de retorno:
A primeira linguagem de programação a adotar criptografia moderna
Outra novidade que virá na versão 7.2 é referente à criptografia moderna libsodium, que será parte da extensão principal do PHP 7.2. Sodium é uma biblioteca que facilita a utilização de criptografia, descriptografia, assinatura, 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: 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, feito com base em dados de novembro de 2016 e maio de 2017.
Fonte: seld.be/notes/php-versions-stats-2017-1-edition
Você ainda não está utilizando PHP 7? O que está te impedindo de fazer a atualização? Na KingHost nós o 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, pois fomos uma das primeiras empresas de hospedagem do Brasil a disponibilizar suporte ao PHP 7 e 7.1, e com certeza seremos os primeiros a disponibilizar a versão 7.2.
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 à novas features. Vale muito a pena olhar cada item alterado.
Já posso testar esta nova versão? Sim, o release Alpha 2 já está disponível. Você já pode ver quais alterações entrarão nessa nova versão e testar.
Isso é tudo por enquanto, mas se você se deparar com outras mudanças que não foram mencionadas aqui, deixe um comentário abaixo. Obrigado pela leitura.