PHP 7.2 foi lançado oficialmente no dia 30 de novembro. A versão possui novos recursos, funções e melhorias que nos permitirão escrever um código melhor. Neste post, apresentarei alguns dos recursos de linguagem mais interessantes do PHP 7.2.

Atualização: O PHP 8.0 (versão oficial) está agora disponível para todos os clientes Kinsta.

Você pode ver a lista completa de mudanças na página de Pedidos de Comentários.

Melhorias Principais

Declarações de digitação do argumento

Desde o PHP 5, temos permissão para especificar na declaração de uma função a digitação do argumento esperado a ser passado. Se o valor fornecido for de um tipo incorreto, o PHP aponta um erro.

As declarações de digitação do argumento (também conhecidas como dicas de digitação) especifica o tipo de uma variável que deve ser passada para uma função ou método de classe.

Por exemplo:

class MyClass {
	public $var = 'Hello World';
}

$myclass = new MyClass;

function test(MyClass $myclass){
	return $myclass->var;
}

echo test($myclass);

Neste código, a função de teste espera um exemplo de MyClass. Um tipo de dados incorreto resultaria no seguinte erro fatal:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8

Já que as dicas de tipo do PHP 7.2 podem ser usadas com o tipo de dados do objeto, essa melhoria permite declarar um objeto genérico como argumento de uma função ou método. Aqui temos um exemplo:

class MyClass {
	public $var = '';
}

class FirstChild extends MyClass {
	public $var = 'My name is Jim';
}
class SecondChild extends MyClass {
	public $var = 'My name is John';
}

$firstchild = new FirstChild;
$secondchild = new SecondChild;

function test(object $arg) {
	return $arg->var;
}

echo test($firstchild);

echo test($secondchild);

Neste exemplo, chamamos a função de teste duas vezes, passando um objeto diferente em cada chamada. Isso não foi possível em versões anteriores do PHP.

Testando as dicas de tipo no PHP 7.0 e PHP 7.2 usando Docker
Testando as dicas de tipo no PHP 7.0 e PHP 7.2 usando Docker

Declarações de digitação de retorno de objeto

Se as declarações de digitação de argumento especificam a digitação esperada para os argumentos de uma função, as declarações de digitação de retorno especificam a digitação esperada do valor de retorno.

As declarações de digitação de retorno especificam a digitação de uma variável que é esperada em retorno de um função.

A partir do PHP 7.2, temos permissão para usar declarações de digitação de retorno para o tipo de dado do objeto. Aqui está um exemplo:

class MyClass {
	public $var = 'Hello World';
}

$myclass = new MyClass;

function test(MyClass $arg) : object {
	return $arg;
}

echo test($myclass)->var;

Versões anteriores do PHP apresentam o seguinte erro fatal:

Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10

É claro que, no PHP 7,2, esse código ecoa “Hello World”.

Alargamento do parâmetro da digitação

Atualmente, o PHP não permite qualquer variação de parâmetros de digitação entre classes filhas e suas classes ou interfaces pais. O que isso significa?

Considere o seguinte código:

<?php
class MyClass {
	public function myFunction(array $myarray) { /* ... */ }
}

class MyChildClass extends MyClass {
	public function myFunction($myarray) { /* ... */ }
}

Aqui omitimos o tipo de parâmetro na subclasse. No PHP 7.0 esse código produz o seguinte aviso:

Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8

No PHP 7.2, estamos autorizados a omitir a digitação em uma subclasse sem quebrar nenhum código. Esta proposta nos permitirá atualizar classes para usar dicas de digitação em bibliotecas sem precisar atualizar todas as subclasses.

Vírgulas à direita na sintaxe da lista

Uma vírgula final após o último item em matrizes é uma sintaxe válida no PHP, e é às vezes encorajada a fim de acrescentar facilmente novos itens e evitar erros de análise devido a uma vírgula ausente. Desde o PHP 7.2 estamos autorizados a usar vírgulas à direita em espaços de nome agrupados.

Veja Vírgulas à direita na sintaxe da lista para uma visão mais próxima neste RFC e alguns exemplos de código.

Melhorias de Segurança

Argon2 no hash da senha

Argon2 é um poderoso algoritmo de hash que foi selecionado como vencedor da Competição de Hashing de Senhas de 2015, o PHP 7.2 o trará para nós como uma alternativa segura ao algoritmo Bcrypt.

O versão nova do PHP apresenta a constante PASSWORD_ARGON2I que agora pode ser usada em funções password_* functions:

password_hash('password', PASSWORD_ARGON2I);

Ao contrário do Bcrypt, que leva apenas um fator de custo, o Argon2 leva três fatores de custo diferenciados da seguinte maneira:

  • Um custo de memória que define o número de KiB que deve ser consumido durante o hash (os valores padrão são 1 << 10 ou 1024 KiB ou 1 MiB)
  • Um custo de tempo que define o número de iterações do algoritmo de hash (o padrão é 2)
  • Um fator de paralelismo, que define o número de encadeamentos paralelos que serão usados durante o hash (o padrão é 2)

Três novas constantes definem os fatores de custo padrão:

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

Aqui temos um:

$options = ['memory_cost' => 1<<11, 'time_cost' => 4, 'threads' => 2];
password_hash('password', PASSWORD_ARGON2I, $options);

Veja Argon2 Password Hash para mais informações.

Libsodium como parte do PHP Core

A partir da versão 7.2, o PHP inclui a Sodium library no seu núcleo. O Libsodium é uma biblioteca multi-plataforma e cruzamento-de-idiomas para criptografia, descriptografia, assinaturas, hashing de senhas e muito mais.

Esta livraria já estava disponível através da PECL.

Para uma lista documentada de funções Libsodium, consulte a biblioteca Guia Rápido.

Veja também PHP 7.2: A primeira linguagem de programação que vai adicionar criptografias modernas à sua biblioteca padrão.

Depreciações

Aqui temos uma lista das Funções e Recursos Reprovados do PHP 7.2 que serão removidos antes mesmo do PHP 8.0:

A função __autoload foi substituída pela spl_autoload_register no PHP 5.1. Agora, um aviso de descontinuação seria lançado quando fosse encontrado durante a compilação.

A variável $php_errormsg é criada no escopo local quando um erro não fatal é lançado. Desde o PHP 7.2, error_get_last e error_clear_last deveriam aparecer em seu lugar.

create_function() permite a criação de uma função com um nome de função gerado, uma lista de argumentos e código do corpo fornecidos como argumentos. Devido a problemas de segurança e mal desempenho, ele foi marcado como obsoleto e o uso de gabinetes é incentivado.

mbstring.func_overload, a configuração ini definida como um valor diferente de zero foi marcada como reprovada.

(unset) cast é uma expressão que sempre perde seu valor e é considerada inútil.

parse_str() analisa uma seqüência de consulta em uma matriz se o segundo argumento for fornecido na tabela de símbolos locais, caso não esteja sendo usado. Como definir variáveis no escopo da função é desencorajado por razões de segurança, o uso de parse_str() sem o segundo argumento lançará um aviso de descontinuidade.

gmp_random() é considerado dependente da plataforma e será descontinuado. Use gmp_random_bits() e gmp_random_rage() no seu lugar.

each() é usado para iterar sobre uma matriz assim como foreach(), mas o foreach() é preferível por várias razões, incluindo o fato de ser 10 vezes mais rápido. Agora, uma depreciação será lançada na primeira chamada em um loop.

A função assert() verifica a afirmação dada e toma as ações apropriadas se o resultado for FALSO. O uso de assert() com o argumento string agora está obsoleto, pois abre uma vulnerabilidade RCE. A opção zend.assertion pode ser usada para impedir a avaliação de expressões de asserção.

$errcontext é uma matriz contendo as variáveis locais existentes no momento em que um erro é gerado. Ele é passado como o último argumento para manipuladores de erros definidos com a função set_error_handler().

O que PHP 7.2 significa para usuários do WordPress?

De acordo com a Página de Estatísticas do WordPress até agora, apenas 19,8% dos usuários do WordPress atualizaram para o PHP 7. Apenas 5% estão usando PHP 7.1. Você pode ver que uma grande maioria dos usuários, acima de 40%, ainda está rodando no PHP 5.6. O que é ainda mais assustador é que mais de 39% dos usuários estão usando versões do PHP não suportadas. Em dezembro de 2016, o WordPress.org realmente aumentou sua recomendação oficial para usuários do PHP 5.6 ao PHP 7 ou superiores.

WordPress PHP 7.1
WordPress PHP 7.1

Os números acima são muito desanimadores, do ponto de vista do desempenho, já que o PHP 7 mostrou ser significativamente mais rápido. Aqui temos algumas estatísticas:

  • Algumas marcas de referência mostram que o PHP 7 permite que o sistema rode duas vezes mais solicitações por segundo em comparação com o PHP 5.6, em quase metade da latência.
  • Christian Vigh também publicou uma comparação da performance PHP na qual ele descobriu que o PHP 5.2 era 400% mais lento que o PHP 7.

Também executamos nossos próprios benchmarks de desempenho em 2018 com PHP 5.6 vs PHP 7 vs HHVM. Similarmente aos benchmarks acima, vimos que o PHP 7.2 poderia executar quase três vezes mais transações (solicitações) por segundo em comparação com o PHP 5.6.

Benchmarks
Benchmarks
  • WordPress 4.9.4 PHP 5.6 resultados do: 49.18 req/sec
  • WordPress 4.9.4 PHP 7.0 resultados do: 133.55 req/sec
  • WordPress 4.9.4 PHP 7.1 resultados do: 134.24 req/sec
  • WordPress 4.9.4 PHP 7.2 resultados do: 148.80 req/sec ?
  • WordPress 4.9.4 HHVM resultados do: 144.76 req/sec

Muitos são lentos para atualizar simplesmente devido ao tempo envolvido em testar novos plugins e temas de terceiros para garantir que eles funcionem corretamente. Mas muitas vezes, isso se resume ao fato de que eles simplesmente ainda não o fizeram. Não tem certeza de qual versão do PHP você está executando? Uma das maneiras mais fáceis de verificar isso é usar uma ferramenta como o Pingdom ou o Devtools do Google. O primeiro cabeçalho de solicitação HTTP geralmente mostra a versão.

Verifique a versão do seu PHP
Verifique a versão do seu PHP

Isso depende do host não modificar o valor do cabeçalho X-Powered-By. Se o fizerem, você pode não ver sua versão do PHP, caso em que você precisaria carregar um arquivo via FTP. Ou você sempre pode entrar em contato com seu host e perguntar a ele.

Atualizando para o PHP 7.2

O PHP 7.2 ainda não foi lançado oficialmente, mas quando ele sair você já vai poder começar a testar. Você pode testar o seu site WordPress localmente ou verificar seus scripts em um ambiente como o Docker, que permite testar diferentes versões do PHP a partir da linha de comando.

Ou você pode utilizar um ambiente de preparação, pois isso se parecerá mais com um site de produção ao vivo. A Kinsta disponibilizou o PHP 7.2 para todos os clientes no dia 4 de dezembro. Você pode criar facilmente um ambiente de preparo com um único clique.

Teste o PHP 7.2 no ambiente de teste
Teste o PHP 7.2 no ambiente de teste

Basta um clique para alterar o mecanismo do PHP para o site de teste em “Ferramentas” e você pode começar a testar para garantir a compatibilidade de seus plugins de terceiros e temas. Depois de confirmar que tudo funciona, você pode alterar seu site de produção para o PHP 7.2 ou empurrar seu site de teste para a vida.

Mudança para o PHP 7.2
Mudança para o PHP 7.2

Conclusões

Você está pronto para mudar para o PHP 7.2? Espero que até agora você tenha feito pelo menos a transição para o PHP 7. Se você ainda não o fez, é um bom momento para começar a testar. Então, atualize seus scripts, verifique seu código e nos conte suas primeiras impressões do PHP 7.2.

Leitura recomendada: PHP está morto?

Carlo Daniele Kinsta

Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for over 10 years, also in collaboration with Italian and European universities and educational institutions. He has written dozens of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find Carlo on Twitter and LinkedIn.