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 é um apaixonado por webdesign e desenvolvimento frontend. Ele tem mais de 10 anos de experiência com WordPress e colaborou com diversas universidades e instituições educacionais na Itália e na Europa. Carlo já publicou inúmeros artigos e guias sobre WordPress, tanto em sites italianos quanto internacionais, além de revistas impressas. Você pode seguir ele no LinkedIn e no X.