PHP 7 e novidades do PHP 7.1

(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

PHP Básico
Curso de PHP Básico
CONHEÇA O CURSO
Como 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.

Pseudo-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.

PHP - Novidades dos PHP 7.0 e 7.1
Curso de PHP - Novidades dos PHP 7.0 e 7.1
CONHEÇA O CURSO
Deixe seu comentário
Share

Head de desenvolvimento. Vasta experiência em desenvolvimento Web com foco em PHP. Graduado em Sistemas de Informação. Pós-graduando em Arquitetura de Software Distribuído pela PUC Minas. Zend Certified Engineer (ZCE) e Coffee Addicted Person (CAP). @KennedyTedesco