Em junho de 2015 será lançado o alpha release do PHP 7, sendo a primeira versão maior a ser liberada depois de anos e a sucessora da atual 5.6. Essa nova versão trás muitas novidades e é um salto incrível para o PHP em termos de performance e sintaxe do código.
Mas o que houve com o PHP 6? Há alguns anos circulou uma versão preliminar do que pretendiam lançar como o PHP 6. A versão nunca foi concluída, mas algumas empresas a utilizaram e inclusive livros foram publicados sobre ela. Para evitar confundir a nova versão do PHP com essepre-release antigo, resolveram batizá-la de “PHP 7”.
Vamos às novidades:
Performance, muita performance!
A performance do PHP 7 em relação ao 5 aumentou em torno de 10–25% de acordo com os primeiros testes. Existem vários testes de performance por aí, alguns sugerindo mais velocidade do que usando a HHVM.
Novas palavras reservadas
No PHP 7 teremos novas palavras reservadas, incluindo os nomes dos tipos de dados primitivos (int, float, bool, string, true, false, null) além de resource,object, scalar, mixed e numeric. Essas palavras não poderão ser usadas em namespaces, nomes de classes, traits e interfaces.
Essa mudança foi feita agora para possibilitar a criação de classes representando tipos escalares em uma versão futura (quem sabe no PHP 7.1!). Para ver a mágica que se pode esperar disso, consulte este repositório:https://github.com/nikic/scalar_objects. Já pensou poder chamar $string->length() ao invés de strlen($string)?
Remoção dos Construtores do PHP 4
No PHP 5 ainda era suportado o jeito antigo de escrever métodos construtores para as classes. No PHP 7 esses construtores antigos lançarão um aviso do tipo E_DEPRECATED
<?php class Veiculo { public function veiculo() { // um construtor no PHP 4, lançará um E_DEPRECATED no PHP 7 }
public function __construct() { // um construtor no PHP 5 } }
Operador “Espaço-nave”: <=>
Esse operador funciona de forma semelhante aos <, <=, ==, > e >=, mas caso a comparação seja idêntica, retornará 0. Se o valor da esquerda for maior, retornará 1, se o valor da direita que for maior, retornará -1.
<?php var_dump(42 <=> 42); // retorna 0 var_dump(42 <=> 5); // retorna 1 var_dump(5 <=> 42); // retorna -1
Declaração do Tipo de Retorno
É possível declarar o tipo de retorno dos métodos, desta forma assegurando o tipo de retorno de maneira mais consistente do que simplesmente escrevendo um PHPDoc. Através disso será possível prevenir que um método que sobrescreve outro quebre o tipo de retorno original, além de impossibilitar que um método retorne null, forçando uma boa prática de programação.
<?php function getCliente() : Cliente { return new Cliente; // válido // return null; // inválido // return 12345; // inválido // return new OutraClasse; // inválido }
Tipos de Parâmetros Escalares
O PHP 5.6 já permite obrigar que um argumento de um método seja do tipo array ou uma instância de determinada classe. Com o PHP 7 também é possível declarar que um parâmetro precisa ser de um tipo escalar (int, float, string e bool):
<?php function somaInteiros(int $a, int $b) { return $a + $b; } somaInteiros(1, 2); // retorna 3 somaInteiros("string", false); // erro
Escape de caracteres Unicode
Agora será possível fazer o escape de qualquer caractere Unicode em strings através da seguinte sintaxe:
<?php echo "\u{1F602}"; // imprime o emoji "😂"
Operador “Null Coalesce”: ??
Muitas vezes temos a necessidade de testar se um parâmetro existe, retornando seu próprio valor caso positivo, e um valor alternativo caso contrário. No PHP 5.6, teríamos de testar a existência do parâmetro antes de retornar seu valor, caso contrário receberíamos um E_NOTICE. Agora é possível usar o operador ??, que testa a presença do parâmetro e não lança um aviso em caso de não estar definido:
<?php $lista = ['chave' => 'valor'];
// PHP 5.6 $a = isset($lista['nao_tem']) ? $lista['nao_tem'] : 123; // válido $a = $lista['nao_tem'] ?: 123; // E_NOTICE se a chave não existir
// PHP 7 $a = $lista['nao_tem'] ?? 123; // válido
Sintaxe Uniforme de Variáveis
Foi introduzida uma sintaxe de variáveis consistente, que permitirá realizar operações sobre expressões arbitrárias, aninhadas e/ou diferentes, de forma semelhante ao que já podemos fazer em JavaScript.
<?php $empresa->getConsultores()[0]->marcarComoAtivo(); Classe::getClosure()();
Remoção de Tags Alternativas
As seguintes tags alternativas para abrir e fechar código PHP foram removidas: <%, <%=, %>, <script language=”php”>, </script>.
Agrupar classes inclusas com “use”
Quando utilizamos diversas classes de um mesmo namespace, agora será possível agrupá-las ao invés de repetir o namespace para cada classe:
<?php // PHP 5.6 use yii\helpers\ArrayHelper; use yii\helpers\Html; use yii\helpers\Url;
// PHP 7 use yii\helpers\{ArrayHelper, Html, Url};
Operador de Divisão de Inteiros
Foi adicionado um novo operador (%%) e uma nova função (intdiv) que permitem a divisão de um inteiro por outro, retornando um inteiro ao invés de um float. Desta forma, 3 %%2 (ou intdiv(3, 2)) resultaria em 1 enquanto 3 / 2 resultaria em 1.5.
Classes Anônimas
Tais como funções anônimas (closures), classes anônimas são úteis quando apenas criadas e/ou utilizadas em tempo de execução.
<?php var_dump((new class { public function execute() { return 12345; } })->execute()); // 12345
Conclusão
O ciclo para envio de novas propostas para o PHP 7 já está encerrado, então é possível que não hajam outras novidades importantes nesta versão. Para saber mais e acompanhar o desenvolvimento do PHP, acompanhe a página de Request for Comments no site.
Obrigado pelo seu artigo, boas novidades!
Muito bacana cara!