(Apesar do final da URL desse post terminar em 7.1, prometo que não trataremos de nenhuma tragédia aqui. Vamos falar só de coisas boas!)
PHP 7
Um ano depois do lançamento da primeira grande versão do PHP, a 7.0, hoje foi lançada a primeira minor version da série, a 7.1.
Isso é algo grande! O PHP é um projeto open source e ele depende de toda uma comunidade para que as coisas aconteçam. Também é fato que, assim como outros projetos de grande porte, ele tem ajuda de algumas importantes empresas privadas que colocam à disposição a mão de obra de alguns dos seus melhores engenheiros mas, no final, todo o trabalho é altruísta: da comunidade para a comunidade. Nem vale entrar muito no mérito de que, quem participa ativamente de um projeto dessa magnitude, está não só ajudando a comunidade como a si mesmo (o que é um fato), sim, de certo é uma via de mão dupla e, cá pra nós, que pecado isso tem? Justo. Que se dê mérito e reconhecimento para quem assim os faz por merecer.
O PHP 7.0 veio com diversas features e algumas atualizações substanciais na sua engine, que foi praticamente reescrita e lançada como sendo a terceira versão: Zend Engine v3.0.0. Com essa atualização o PHP passou a ser até 2x mais rápido (em alguns casos até mais que isso) que a sua versão anterior (a 5.6) e consome bem menos memória, graças à uma grande reestruturação na sua hashtable.
Leitura recomendada para quem se interessa por algoritmos e estrutura de dados
Curso PHP - Novidades do PHP 8.1 e 8.2
Conhecer o cursoComo assim a 5.6 precede a 7.0 e não a 6.0?
Ah, uma longa história … O PHP, sim, pulou da versão 5.6 para a 7.0. Não foi na surdina da noite como fazem alguns dos nossos políticos com as suas pautas emergenciais. A decisão de pular a versão 6.0 foi discutida por várias meses e votada de forma honrosa.
Há cerca de 10 anos o PHP teve um esboço iniciado do que seria a futura versão 6.0. Mas o planejamento não foi muito legal e o core ficou bastante “prejudicado” com uma alteração importante que dava à linguagem suporte nativo a Unicode. Paralelamente a isso, versões menores continuaram a ser lançadas (como a 5.3) e não conseguiram o êxito de manter os branchs sincronizados. Com isso, naturalmente, o projeto da versão 6.0 entrou em colapso, só que, antes disso, diversos autores começaram a publicar livros sobre o “PHP 6.0” (que nem estavelmente ainda houvera sido lançado). Então, pelo bem de todos (inclusive dos futuros desenvolvedores da linguagem), decidiram pular a 6.0 e fazer tudo certinho na 7.0.
Novidades do PHP 7.1
O PHP 7.1 foi oficialmente lançado ontem (01/12/2016) trazendo consigo diversas melhorias. Algumas das principais:
- Nullable Types (possibilidade de um parâmetro receber um tipo específico ou null)
- Habilidade de pegar múltiplas exceções num mesmo bloco catch
- Criação de um pseudo-tipo chamado Iterable
- Habilidade de definir visibilidade para constantes de classes (public, private, protected)
- Diversas melhorias à extensão Curl, dentre elas, suporte a HTTP/2 Server Push.
- Tipo void para parâmetros e retornos de funções/métodos.
- Incrementos na utilização list()
- O suporte a mcrypt() foi removido da linguagem (tornou-se defasado devido à implementações mais atualizadas e seguras que hoje temos à disposição).
Todos os outros RFC’s aprovados e implementados na versão 7.1 você pode ver aqui: https://wiki.php.net/rfc#php_71
Se desejar ver um changelog completo da versão: http://www.php.net/ChangeLog-7.php#7.1.0
Abaixo veremos algumas dessas novidades em pequenos exemplos com código.
Nullable Types
Esse operador é identificado pelo sinal de interrogação ? quando precedido do tipo de dado da variável. Ele informa ao interpretador que é aceitável aquele tipo específico ou um valor null.
Imagine esse protótipo:
function bar(int $value) {
if($value) {
// todd
} else {
// todo
}
}
A função bar() precisa obrigatoriamente receber um valor inteiro. Não receber nada não é uma opção, receber outro tipo, também não é.
Portanto, se tentarmos executá-la assim:
bar();
Um erro é gerado:
Uncaught TypeError: Argument 1 passed to bar() must be of the type integer, none given ...
Agora, no PHP 7.1, o desenvolvedor tem a opção de usar o operador ? antes do tipo, especificando que ele aceita dados daquele tipo ou null.
Basta que alteremos a assinatura da função:
function bar(?int $value) {
Agora sim podemos não enviar nada ou enviar null:
bar(null); // ok
bar(1); // ok
bar(0); // ok
bar(); // Erro! É preciso enviar null ou um valor do tipo que a função espera receber
bar("1"); // Erro! O tipo enviado não é inteiro.
Capturando múltiplas exceções
Antes a única opção era:
try {
// todo
} catch (MyException1 $e) {
// todo
} catch (MyException2 $e) {
// todo
} catch (Exception $e) {
// todo
}
No PHP 7.1 é possível agrupar mais de uma exceção num mesmo bloco catch:
try {
// todo
} catch (MyException1 | MyException2 $e) {
// todo
} catch (Exception $e) {
// todo
}
Visibilidade para constantes de classes
Agora é possível definir as visibilidades public, protected e private para as constantes de classes:
class Squirtle extends Pokemon
{
protected const SUPER_POWER = 100;
}
(Como você pode observar, não entendo nada de Pokemon. Perdão! :/)
Enfim. O exemplo acima deixa explícito que, acessar essa constante externamente não será possível, ou seja, isso aqui não vai funcionar:
echo Squirtle::SUPER_POWER;
Como o acesso é protegido, apenas a própria classe e sub-classes derivadas dela terão tal “poder” de acesso.
Void return
Na 7.1 é possível retornar void
como sendo um tipo de retorno válido.
Exemplo:
class Squirtle extends Pokemon
{
public function run() : void
{
// todo
}
}
O método run() apenas executa uma ação, ele não retorna nada. Se tentarmos retornar algum valor (seja lá de que tipo for) uma exceção será gerada.
Curso PHP - Novidades dos PHP 7.0 e 7.1
Conhecer o cursoPseudo-tipo iterable
O pseudo-tipo iterable informa que o parâmetro ou o retorno da função/método é algo “iterável”. Pode ser um array ou um objeto que implemente a interface Traversable.
Exemplo:
class Squirtle extends Pokemon
{
public function change(iterable $meta) : void
{
foreach($meta as $key => $value) {
// todo
}
}
}
Nesse caso, o parâmetro $meta só aceita um valor iterável, algo que possa ser utilizado num foreach.
Se tentarmos passar, por exemplo, um tipo primitivo, uma exceção será lançada.
Esse pseudo-tipo também pode ser usado para informar o tipo de retorno da função/método. Exemplo:
class Squirtle extends Pokemon
{
public function getMeta() : iterable
{
return [1, 2, 3, 4, 5];
}
}
Claro, se o tipo de dado que o seu método for trabalhar for, sem exceção, um array e nada mais, então não faz sentido iterable, use array.
Concluindo
Na página dos RFC’s você encontra a documentação completa de todas as features, inclusive com exemplos. Essa versão, claro, não se limitou apenas à novas features. Ela corrigiu diversos bugs, inclusive relacionados à segurança e também alterou alguns comportamentos, como o da variável especial $this. Vale muito a pena olhar cada item alterado.
O que vem pela frente? A próxima minor version, a versão 7.2. Você já pode ver o que já entrou nessa versão (ainda em desenvolvimento), clicando aqui.
Está lembrado do banner do post (com o elefante) lá em cima? Então, proclamemos: Go! Go! PHP 7.