PHP 7 Lançado com Várias Melhorias - Softerize Magazine
Oscar Dias 8 de dezembro de 2015 2 Comentários
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.
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).
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:
$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:
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.
$a = $z ?? "padrao";
É o equivalente a fazermos:
$a = isset($z) ? $z : "padrao";
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:
// 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:
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.
Assim como as declarações de tipo, agora é possível definir tipos de retorno de funções e métodos.
<?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:
Esta novidade permite declarar classes simples, para serem utilizadas apenas uma vez, da seguinte maneira:
// 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; } });
// Código nas versões anteiores
// Código PHP 7+
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:
use App\Models\{ Pessoa, Tag, Artigo as Post };
Isso vai poupar algumas linhas de código 😉
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 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.
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:
<?php class Pessoa { public function Pessoa() { // construtor } }
public function Pessoa() {
A partir de agora será permitido apenas __construct(). Ainda será possível utilizá-los, mas recebendo um aviso E_DEPRECATED.
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?