Principais melhorias e mudanças no PHP 7

Principais mudanças e melhorias que ocorreram no PHP 7

O PHP sofreu uma grande mudança recentemente com a nova atualização do PHP 5.6 para o PHP 7. Com isso tivemos novos recursos, melhorias e , ganhos significativos em performance se comparado a versões anteriores.

  • Breve História por trás do PHP 7
  • Desempenho, duas vezes mais rápido
  • Novos Recursos
  • Diferenças entre os PHP 7 e PHP 5.6
  • Porque usar o PHP 7?

Breve História por trás do PHP 7

Muito antes do PHP 7 ser lançado, houve bastante discussão na comunidade sobre uma nova atualização do PHP que seria a versão 6. No entanto o PHP 6 foi uma tentativa de atualizar a versão da linguagem e teve seu lançamento na metade de 2010 mas infelizmente não conseguiu andar.

O que deu errado?

Um dos objetivos do PHP 6 era a adição ao suporte nativo para Unicode. Isso representou uma grande mudança e muitos novos recursos deixaram de ser implementados na versão 5.x do PHP porquê o suporte a Unicode deveria ser adicionado primeiro.

Então desde o começo, muito coisa deu errado tais como a decisão logo no início (2005) de usar internamente UTF-16, o que também teve impacto negativo na performance da linguagem, a adoção generalizada de UTF-8 que ajudou em muitos problemas internos mas deixou os objetivos da atualização irrelevantes, desenvolvedores cadas vez mais menos interessados no projeto.

E entre  os anos 2009/2010 ficou notório que o projeto PHP 6 nunca iria acontecer.

Desempenho duas vezes mais rápido

Uma das atualizações mais empolgantes do PHP 7 está no ganho significativo de performance da nova versão que chega o dobro da versão anterior PHP 5.x. Isso se deve a reescrita total da Zend Engine e a notável otimização no consumo de memória.

Estas são as melhorias que tivemos:

  • Melhoria na performance: Duas vezes mais rápido do que o PHP 5.6
  • Significativa redução no uso de memória
  • Abstract Syntax Tree
  • Suporte Consistente 64-bit
  • Melhoria no lançamento de Exception’s hierárquicas
  • Muitos erros fatais foram convertidos para Exception’s
  • Gerador de números aleatórios mais seguro
  • Antigas e Não suportadas Extensões SAPIS removidas
  • The null coalescing operator (??)
  • Return e Scalar Type Declarations
  • Anonymous Classes

Novos Recursos

Declarações de tipos escalares

Tipos de dados escalares em parametros de funções podem ser forçados tais como strings, inteiros (int), números com ponto flutuante (float) e booleanos (bool). Os outros tipos que já existiam no PHP 5 foram incrementados: class names, interfaces, array and callable.

class C {}
class D extends C {};

// This doesn't extend C.
class E {}

function f(C $c) {
  echo get_class($c)."\n";
}

f(new C);
f(new D);
f(new E);

O exemplo acima irá imprimir

C
D

Fatal error: Uncaught TypeError: Argument 1 passed to f() must be an instance of C, instance of E given, called in - on line 14 and defined in -:8
Stack trace:
#0 -(14): f(Object(E))
#1 {main} thrown in - on line 8

Mais Exemplos aqui

Por padrão o php irá realizar o parse de um tipo errado para o tipo esperado pela função. Por exemplo, uma função que esteja passando um inteiro para um parâmetro que deveria ser uma string a variável será uma string.

É possível também habilitar o modo rigoroso (strict mode) onde somente será aceita a variável do exato tipo que foi declarada na função. Para habilitar basta usar a declaração declare com o argumento strict_types assim: declare(strict_types=1);

declare(strict_types=1);
function sum(int $a, int $b) {
    return $a + $b;
} 
var_dump(sum(1, 2)); var_dump(sum(1.5, 2.5)); 

Declaração do tipo de retorno

Bem parecido com as declarações de tipos escalares a declaração do tipo de retorno especifica qual tipo de dado uma dada função deve retornar. Os tipos suportados são os mesmos da declaração de tipos.

<?php

function arraysSum(array ...$arrays): array {
  return array_map(function(array $array): int {
    return array_sum($array);
  }, $arrays);
}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

Null coalescing operator (??)

Este recurso surgiu com a necessidade de se usar o operador ternário junto com o a função isset(). Ele retorna o primeiro operando caso ele exista e seja diferente de nulo (NULL), do contrário retornará o segundo operando.

<?php
// Obtém o valor de $_GET['user'] e retorna 'nobody'
// se ele não existir.
$username = $_GET['user'] ?? 'nobody';

// Isto equivale a:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// A coalescência pode ser encadeada: isto irá retornar o primeiro
// valor definido entre $_GET['user'], $_POST['user'] e
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

Spaceship operator

Este novo operador é usado para comparar duas expressões. Retorna -1, 0, 1 quando $a for respectivamente menor que, igual ou maior que $b.

<?php
// Inteiros
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Números de ponto flutuante
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>

Arrays como Constants

Constantes do tipo array agora podem ser definidas com a função define(). No PHP 5.6 elas só poderiam ser definidas com const.

<?php
define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // imprime "cat"
?>

Classes anônimas

 

O suporte a classes anônimas foi adicionado utilizando o operador new class. O principal objetivo de se utilizar classe anônimas é quando desejamos substituir definições de classes completas para objetos descartáveis. Segue um exemplo detalhado:

 

<?php
interface Logger {
    public function log(string $msg);
}

class Application {
    private $logger;

    public function getLogger(): Logger {
         return $this->logger;
    }

    public function setLogger(Logger $logger) {
         $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});

var_dump($app->getLogger());
?>

 

Porém tome muito cuidado ao usar este recurso, pois o seu mal uso causará dificuldades em ler e entender o seu código.

IntlChar

A classe IntlChar é responsável por disponibilizar alguns métodos de acesso a informações sobre caracteres Unicode e recebeu atualizações de funcionalidades adicionais, por exemplo:

<?php

printf('%x', IntlChar::CODEPOINT_MAX); // 10ffff
echo IntlChar::charName('@');          // COMMERCIAL AT
var_dump(IntlChar::ispunct('!'));      // bool(true)

Agrupamento de declarações use

Classes, funções e constantes importadas do mesmo namespace, agora podem ser agrupadas em uma única declaração use facilitando a sua leitura.

<?php
// Código anterior ao PHP 7
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// Código do PHP 7+
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>

Conclusão

Fica claro que o PHP evolui bastante em muitos pontos que antes eram considerados pontos fracos da linguagem. Melhorias na performance, adição de recursos úteis e facilidade de escrita de algumas estruturas facilita muito a vida de quem usa.

Por fim, estes são alguns dos principais recursos que o PHP 7 trouxe. Porém vários outros novos recursos já foram adicionados ao PHP 7.1 e 7.2. Vale informar aqui alguns deles, que são:

Referências:

http://php.net/releases/7_0_0.php

https://wiki.php.net/todo/php60

https://www.phproundtable.com/episode/what-happened-to-php-6

https://imasters.com.br/linguagens/php/o-debate-sem-fim-php-6-versus-php-7

Julio Alves
administrator
Julio Alves é desenvolvedor web com mais de 8 anos de experiência, amante de PHP, Javascript, NodeJS, Ionic e ReactNative. Graduado em Sistemas de Informação pela Faculdade Estácio FIC do Ceará. Acredita que para se tornar um bom programador é preciso sobretudo ser esforçado e aberto para aprender todos os dias.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Lançamento Novo Curso de PHP 7
Lançamento Novo Curso de PHP 7