Iniciando com PHP 7

de Oliveira, Lucas • January 26, 2016

php php7

Se você programa em PHP ou acompanha as notícias sobre desenvolvimento, deve estar sabendo que o PHP 7 foi oficialmente lançado a quase dois meses, e para você que ainda não viu as novas características ou quer saber um pouco mais, continue lendo este post, pois resolvi iniciar esse blog escrevendo e testando algumas de suas novas funcionalidades. No momento que estou escrevendo este post, já li vários artigos sobre o PHP 7, por sinal a grande maioria muito bom, já recebi até e-mail de cursos completos que dizem ser totalmente voltado para essa nova versão.

Então vamos lá! vamos ver o que tem de novo e quais são algumas das incompatibilidades com as versões anteriores.

Scalar Types

Primeiramente queria falar de duas novas características que eu particularmente aguardava, que é a possibilidade declarar o tipo de valor a ser passado por parâmetro utilizando string, int, float e bool, na versão 5 era possível utilizar apenas array e objetos.

Com essa nova característica podemos criar códigos bem mais consistentes, ter mais facilidade para trabalhar em equipe e ter menos erros.

Então, agora é possível fazer algo desse tipo:

<?php
function soma(int $x, int $y) {
    return $x + $y;
}

Declaração de tipo de retorno

E o que eu mais aguardava que era a possibilidade de declarar o tipo do valor de retorno em uma função ou método. É bem simples utilizar este novo recurso, basta adicionar dois pontos : e o tipo de retorno (int, string, etc..) após fechar o parenteses dos parâmetros e o tipo valor de retorno já está declarado. Caso o tipo de valor retornado não seja o mesmo que o declarado, o PHP irá disparar um Fatal error.

Sendo assim, com o PHP 7 podemos criar funções declarando o tipo de retorno da seguinte maneira.

<?php
function soma(int $x, int $y) : int {
    return $x + $y;
}

Operador Null coalescing ??

Acredito que essa seja uma característica que realmente será muito útil e poderá deixar o código mais limpo, apesar de fazer algo bem simples. Se você costuma escrever código como do exemplo a seguir para testar a existência de uma variável e atribuir um valor, será muito útil pra você:

<?php
$usuario = isset($dados['usuario']) ? $dados['usuario'] : 'anonimo';

No PHP 7 poderá ter a mesma funcionalidade escrevendo o seguinte código:

<?php
$usuario = $dados['usuario'] ?? 'anonimo';

Realmente reduziu ainda mais a quantidade de código, ficou simples e ainda no meu ponto de vista deixa o código mais limpo, muito bom!

Operador Spaceship <=>

Este novo operador spaceship que é representado por <=>, é usado para comparação de duas expressões, podendo ser numérico ou não. A utilização desse operador retorna -1 se o valor da esquerda for menor que o da direita, 0 se os valores forem iguais e 1 se o da esquerda for maior que o da direita, conforme mostra o exemplo a seguir:

<?php
var_dump(2<=>3); // int(-1)
var_dump(2<=>2); // int(0)
var_dump(2<=>1); // int(1)

var_dump("A"<=>"a"); // int(-1)
var_dump("a"<=>"a"); // int(0)
var_dump("a"<=>"A"); // int(1)

Criar uma constante array usando define()

Com o PHP 7 é possível armazenar um array em uma constante e então recuperar os valores pelo índice. Na versão 5.6 também é possível fazer isso, mas apenas utilizando const.

<?php
define('USUARIO', [
    'nome',
    'sobrenome',
    'email'
]);

echo USUARIO[1]; // sobrenome

Classes anônimas

No PHP 7 foi introduzido também a possibilidade de utilizar classes anônimas, em versões anteriores era possível fazer isso com funções. Podemos utilizar classes anônimas quando queremos criar uma classe, utilizar apenas uma vez e então descartar.

Um exemplo que achei interessante é da utilização com os Patterns Subject e Observer.

<?php
interface IObserver {
    public function update(ISubject $subject);
}

interface ISubject {
    public function attach(IObserver $observer);
    public function detach(IObserver $observer);
    public function notify();
}

class ClienteSubject implements ISubject {
    protected $observers = [];

    public function attach(IObserver $observer) {
        $this->observers[] = $observer;
    }

    public function detach(IObserver $observer) {
        // ...
    }

    public function notify() {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    public function updateNome($nome) {
        $this->nome = $nome;
        $this->notify();
    }

    public function getNome() {
        return $this->nome;
    }
}

$cliente = new ClienteSubject();

// Agora vamos usar uma classe anônima
$cliente->attach(new class implements IObserver {
    public function update(ISubject $subject) {
        printf('Cliente %s atualizado', $subject->getNome());
    }
});

$cliente->updateNome("Teste classe anônima");

Agrupando declarações de use

Com o PHP 7 é possível agrupar a importação de classes de um mesmo namespace.

<?php
use exemplo\namespace\ {
    ClasseA as a,
    ClasseB,
    ClasseC
};

Construtor depreciado PHP 4

Não sei se você conhecia ou já tinha utilizado este tipo de construtor, pois foi introduzido na versão 4 do PHP e não é comum ser utilizado atualmente, mas é possível criar um construtor utilizando o mesmo nome da classe como é feito em outras linguagens de programação, porém essa funcionalidade a partir da versão 7 está depreciada e irá emitir um E_DEPRECATED caso seja utilizada, e será removida em futuras versões do PHP. O recomendado é que utilize __construct para criação de construtores.

<?php
class Exemplo {
    public function Exemplo() {
        echo 'Construtor executado';
    }
}

Extensão mysql removida

A extensão mysql foi removida na versão 7 do PHP, essa que já é uma função que vinha emitindo uma mensagem de E_DEPRECATED desde versão 5.6, e a partir da versão 7 não será mais utilizada. Essa extensão foi removida principalmente por problemas relacionados a segurança.

Chamar métodos estáticos sem static

O PHP aceita que chame métodos como estáticos mesmo que não seja declarado como static, porém isso a partir da versão 7 está emitindo uma mensagem de E_DEPRECATED e será removido no futuro.

<?php
class Classe {
    function metodo() {
        echo 'Não sou um método estático!';
    }
}

Classe::metodo();

Desempenho

Claro que eu não poderia deixar de falar do incrível desempenho que o PHP 7 vem demostrando em diversos benchmarks que estão sendo realizados tanto por usuários da linguagem quanto pela própria Zend. Com o nova versão do motor Zend Engine o PHP vem mostrando um grande aumento no desempenho quando comparado com a versão 5.6 ou até mesmo com o HHVM que é a versão do PHP criada pelo facebook justamente para ter melhor performance.

Quer saber mais?

O PHP incluiu varias outras características na nova versão, caso você tenha se interessado e queira saber mais, pode dar uma olhada no site oficial php.net, lá você encontra tudo que foi adicionado, alterado e removido. O que eu mostrei aqui foi algumas dessas novas características que achei interessante, espero que tenha gostado, qualquer dúvida ou sugestão, pode me mandar.

Referência: php.net