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.
🚨DICA: Crie um projeto de programação web com HTML5, CSS3 e JavaScript do zero em 3 aulas: MiniCurso Gratuito! 🚀
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
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: