Pular para o conteúdo
Início » PHP 8 Foi Oficialmente Lançado: Confira TODAS as Novidades!

PHP 8 Foi Oficialmente Lançado: Confira TODAS as Novidades!

php 8
Compartilhar:

PHP 8.0 é uma atualização importante da linguagem PHP. Ela contém muitos novos recursos e otimizações, incluindo argumentos nomeados, união de tipos, atributos, promoção de propriedade do construtor, expressão match, operador nullsafe, JIT e melhorias no sistema de tipos, tratamento de erros e consistência.

Argumentos nomeados

PHP 7

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

PHP 8

htmlspecialchars($string, double_encode: false);

Especifique apenas os parâmetros obrigatórios, pulando os opcionais.

Os argumentos são independentes da ordem e auto documentados.

Atributos

PHP 7

class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* … */ }
}

PHP 8

class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* … */ }
}

Em vez de anotações PHPDoc, agora você pode usar metadados estruturados com a sintaxe nativa do PHP.

Promoção de propriedade de construtor

PHP 7

class Point {
  public float $x;
  public float $y;
  public float $z;
  public function __construct(
    float $x = 0.0,
    float $y = 0.0,
    float $z = 0.0,
  ) {
    $this->x = $x;
    $this->y = $y;
    $this->z = $z;
  }
}

PHP 8

fullstack pro - sujeito programador
class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

Menos código boilerplate para definir e inicializar propriedades.

União de tipos

PHP 7

class Number {
  /** @var int|float */
  private $number;
  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}
new Number('NaN'); // Ok

PHP 8

class Number {
  public function __construct(
    private int|float $number
  ) {}
}
new Number('NaN'); // TypeError

Em vez de anotações PHPDoc para uma combinação de tipos, você pode usar declarações de união de tipos nativa que são validados em tempo de execução.

Expressão match

PHP 7

switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!

PHP 8

echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

A nova expressão match é semelhante ao switch e tem os seguintes recursos:

Match é uma expressão, o que significa que seu resultado pode ser armazenado em uma variável ou retornado.

Match suporta apenas expressões de uma linha e não precisa de uma declaração break;.

Match faz comparações estritas.

Operador nullsafe

PHP 7

$country =  null;
if ($session !== null) {
  $user = $session->user;
  if ($user !== null) {
    $address = $user->getAddress();
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

PHP 8

$country = $session?->user?->getAddress()?->country;

Em vez de verificar condições nulas, agora você pode usar uma cadeia de chamadas com o novo operador nullsafe. Quando a avaliação de um elemento da cadeia falha, a execução de toda a cadeia é abortada e toda a cadeia é avaliada como nula.

Comparações mais inteligentes entre strings e números

PHP 7

0 == 'foobar' // true

PHP 8

0 == 'foobar' // false

Ao comparar com uma string numérica, o PHP 8 usa uma comparação numérica. Caso contrário, ele converte o número em uma string e usa uma comparação de string.

Leia também: Os 8 Melhores Frameworks PHP do Mercado

Erros consistentes para tipos de dados em funções internas

PHP 7

strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0

PHP 8

strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

A maioria das funções internas agora lançam uma exceção Error se a validação do parâmetro falhar.

Compilação Just-In-Time

PHP 8 apresenta dois motores de compilação JIT. Tracing JIT, o mais promissor dos dois, mostra desempenho cerca de 3 vezes melhor em benchmarks sintéticos e melhoria de 1,5 a 2 vezes em alguns aplicativos específicos de longa execução. O desempenho típico das aplicações está no mesmo nível do PHP 7.4.

Relativa contribuição JIT para o desempenho do PHP 8

Melhorias no sistema de tipo e tratamento de erros

  • Verificações de tipo mais rígidas para operadores aritméticos / bit a bit 
  • Validação de método abstrato em traits
  • Assinaturas corretas de métodos mágicos 
  • Avisos de motor reclassificados 
  • Erro fatal para assinaturas de método incompatíveis 
  • O operador @ não silencia mais os erros fatais.
  • Herança com métodos privados 
  • Tipo mixed 
  • Tipo de retorno static 
  • Tipagem de funções internas Discussão por email
  • Objetos opacos em vez de recursos para Curl, Gd, Sockets, OpenSSL, XMLWriter, e XML extensões

Outros ajustes e melhorias de sintaxe

  • Permitir vírgula no final da lista de parâmetros  e listas de uso em closures 
  • Catches sem variável na captura de exceção 
  • Ajustes de sintaxe para variáveis 
  • Tratamento de nomes de namespace como token único 
  • Throw como expressão 
  • Permitir ::class em objetos 

Novas classes, interfaces e funções

  • Classe Weak Map
  • Interface Stringable
  • str_contains(), str_starts_with(), str_ends_with()
  • fdiv()
  • get_debug_type()
  • get_resource_id()
  • token_get_all() implementado com objetos

Para downloads do código-fonte do PHP 8, visite a página de downloads. Os binários do Windows podem ser encontrados na página PHP para Windows. A lista de mudanças é registrada no ChangeLog.

E se você chegou até aqui e tem o interesse em aprender php do absoluto zero e passo a passo, vamos colocar abaixo o link de um curso programação perfeito para quem é iniciante:

Participe da conversa

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