Conteúdo
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
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: