Dia 3 de dezembro de 2015 marcou o lançamento oficial do PHP 7, a nova versão da popular linguagem de programação. A última versão lançada do PHP foi a 5, em 2004, mais de 11 anos atrás. Por essa razão a expectativa dos desenvolvedores é grande para esta nova versão. Neste artigo vou falar das principais novidades do PHP 7.
Introdução
Para começar, vou explicar o que aconteceu com o PHP 6. Quando os desenvolvedores do PHP iniciaram os planos para a versão 6, ficou estabelecido que a grande melhoria seria implementar o suporte a Unicode nas strings do PHP. O que aconteceu foi que essa alteração trouxe tantos problemas para o resto do PHP que os desenvolvedores decidiram abandonar a versão 6. Como existiam artigos, livros e grupos que já utilizavam a versão 6, a decisão final foi pular essa versão e ir diretamente para a versão 7.
A versão PHP 5 teve diversas atualização desde o seu lançamento em 2004, sendo a última delas a 5.6. Nesse meio tempo o Facebook andou trabalhando em paralelo no PHP, criando o PHP HipHop Compiler em 2010, depois incluso na HHVM (máquina virtual para execução dos aplicativos compilados). Em 2014 o Facebook lançou a linguagem de programação Hack, baseada no PHP e que também pode ser executada através de HHVM. Essas iniciativas foram todas paralelas ao desenvolvimento do PHP, mas auxiliaram no direcionamento da linguagem.
Nesse contexto foi dado início a criação do PHPNG (PHP Next Generation), uma refatoração do Zend Engine. A partir desse novo motor chegou-se a conclusão que era possível alcançar um grande ganho de performance, portanto o PHPNG virou a base para o PHP 7.
Melhorias no PHP 7
A seguir uma explicação sobre as principais melhorias do PHP 7 em relação as versões anteriores.
Performance
A melhoria mais importante (e com certeza mais comentada) é a performance. De acordo com o site oficial, o PHP 7 chega a ser duas vezes mais rápido do que o PHP 5.6. Uma melhoria considerável. Isso foi possível pois o PHPNG otimiza a utilização da memória e adiciona compilação just in time (JIT). Abaixo alguns gráficos preparados pelo time de performance do Zend (para ver todo o infográfico, clique aqui).
Novos Operadores
Dois novos operadores foram introduzidos no PHP 7.
Spaceship (<=>)
O operador spaceship (ou espaçonave), também conhecido como combined comparison operator (operador de comparação combinado), permite fazer comparações rapidamente. A notação é <=> e ele funciona assim:
1 |
$a <=> $z |
Se $a for menor que $z, a operação vai retornar -1; Caso sejam iguais, o retorno será 0; E caso $a for maior que $z, o valor será 1. É uma maneira mais curta de escrever a seguinte expressão:
1 |
($a < $b) ? -1 : (($a > $b) ? 1 : 0) |
Null Coalesce (??)
O operador null coalesce (ou aglutinador de nulos) permite verificar se uma variável ou chave de array existe e atribuir um valor padrão caso não exista. Isso normalmente era feito com isset(), agora não precisa mais.
1 |
$a = $z ?? "padrao"; |
É o equivalente a fazermos:
1 |
$a = isset($z) ? $z : "padrao"; |
Declarações de Tipo
As declarações de tipos escalares (scalar type declarations) podem ser definidas de duas maneiras: coercive (padrão) ou strict. No modo coercivo, o PHP vai aceitar coisas como uma variável inteira receber um float sem erros ou warnings. Por exemplo:
1 2 3 4 5 6 7 |
// Coercive mode function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1)); // int(9) |
O código acima será executado sem problemas. Mas se você quiser forçar o modo estrito pode usar o seguinte comando:
1 |
declare(strict_types=1); |
A partir do momento que for feita essa declaração (deve ser feita essa declaração em cada arquivo desejado), se você atribuir uma string ou float a uma variável int, como no código acima, você terá o seguinte erro:
Fatal error: Uncaught TypeError: Argument 2 passed to add() must be of the type integer, string given…
A única exceção é quando você atribuir um int a uma variável float. Como um int é um float arredondado, é possível fazer a conversão de int para float sem perdas, portanto não existe erro neste caso.
Tipos de Retorno
Assim como as declarações de tipo, agora é possível definir tipos de retorno de funções e métodos.
1 2 3 4 5 6 |
<?php function a() : bool { return 1; } var_dump(a()); |
O código acima vai rodar normalmente no modo coercivo. A partir do momento que você adicionar o strict_types=1, o PHP vai retornar o seguinte erro:
Fatal error: Uncaught TypeError: Return value of a() must be of the type boolean, integer returned
Classes Anônimas
Esta novidade permite declarar classes simples, para serem utilizadas apenas uma vez, da seguinte maneira:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Código nas versões anteiores class Logger { public function log($msg) { echo $msg; } } $util->setLogger(new Logger()); // Código PHP 7+ $util->setLogger(new class { public function log($msg) { echo $msg; } }); |
Erros Fatais Convertidos para Exceções
Uma das melhores novidades na minha opinião é a conversão de vários erros fatais em exceções. Isso significa que erros que interromperiam a execução no PHP 5+ agora podem ser tratados com um bloco try/catch. Isso possibilita um melhor tratamento de erros dentro de classes e assim diminuindo aquelas telas de erro do PHP. Essa melhoria se dá com a criação da \EngineException, que poderá ser usada para tratar os erros.
Utilização de Classes em Namespaces
A utilização de várias classes em um mesmo namespace foi amplamente simplificada. Agora é possível fazer o seguinte:
1 |
use App\Models\{ Pessoa, Tag, Artigo as Post }; |
Isso vai poupar algumas linhas de código 😉
Itens Removidos
Algumas coisas foram removidas e não vão mais funcionar no PHP 7. Esses itens já eram considerados deprecated, portando ninguém deveria estar usando. É claro que deve ter muito código usando isso por aí, portanto muita gente vai ter dor de cabeça ao atualizar.
Tags
Tags no estilo ASP-style (<%, <%= e %>), foram removidas assim como tags do tipo script (<script language=”php”>). A tag recomendada continua sendo <?php. Algumas funções também foram removidas, como por exemplo o split.
Funções
Entre essas funções estão todas da extensão ereg (ereg_*). Agora deve se utilizar as funções preg_*. Outra extensão abandonada foi a mysql e suas funções mysql_*. Mas não se preocupe, ainda é possível acessar o banco de dados MySQL usando a extensão mysqli e as funções mysqli_*. Aliás, você já deveria estar utilizando elas – se não está, pode começar a substituir.
Construtores PHP 4
No PHP 4 (e no 5 também) era possível declarar construtores com o mesmo nome da classe:
1 2 3 4 5 6 7 8 9 |
<?php class Pessoa { public function Pessoa() { // construtor } } |
A partir de agora será permitido apenas __construct(). Ainda será possível utilizá-los, mas recebendo um aviso E_DEPRECATED.
Conclusão
Essas são algumas das melhorias mais comentadas do PHP 7. Esperamos que com a refatoração feita mais melhorias cheguem nas próximas versões menores e o PHP melhore cada vez mais. E você, já começou a utilizá-lo? Qual melhoria você gostou mais?
grafia: Spaceship ?
Sim!