As novidades do PHP 8

A versão 8.0 do PHP veio com bastante novidades. Esta versão contém muitos novos recursos e otimizações.

Vejamos alguns deles:

Named Arguments

O PHP 8 suporta argumentos nomeados. Para funções/métodos cujo os parâmetros sejam opcionais, o PHP agora permite que você passe o nome do argumento para a função.

Versões anteriores:

file_put_contents($hostname, $content, 0, $stream);

Versão 8:

file_put_contents($hostname, $content, context: $stream);

Isso é muito útil para "pular" a passagem de um parâmetro opcional e já definir o parâmetro desejado sem ter que considerar a posição do mesmo.

Os named arguments (argumentos nomeados) devem ser usado apenas após a passagem dos argumentos posicionais (os argumentos obrigatórios da função). No caso de file_put_contents, como no exemplo, o primeiro e segundo argumentos sempre são posicionais.

Union Types

O PHP8 agora permite definir mais de um tipo para uma propriedade, ou parâmetros e retorno de tipos de funções/métodos. De acordo com a documentação (tradução livre):

Uma declaração de union types aceita valores de vários tipos diferentes, em vez de um único.

Veja um exemplo:

class Number {
    private int|float $number;
public function setNumber(int|float $number): void {
    $this->number = $number;
}

public function getNumber(): int|float {
    return $this->number;
}

}

Match expression

O PHP 8 introduziu a expressão match. Ela lembra um pouco o switch, porém a finalidade é diferente. Uma delas é que match poderá ter o resultado armazenado em uma variável ou retornado. Além disso, ela pode comparar dois valores, sem a necessidade de incluir o break várias vezes.

Veja:

$n = 5;

$resultado = match ($n) { 1, 2 => 'um ou dois', 3, 4 => 'três ou quatro', default => 'maior ou igual a 5', };

var_dump($resultado); // 'maior ou igual a 5'

Caso match não tenha um default definido e o valor em questão não é compatível com as condições definidas, será lançado um UnhandledMatchError.

Ainda assim, há casos onde você não precisa saber exatamente se um valor é igual, mas apenas se ele é verdadeiro ou falso. Nesses casos, você pode usar match, passando true como parâmetro e analisando a variável dentro do mesmo para tal fim.

$idade = 23;

$resultado = match (true) { $idade >= 65 => 'idoso', $idade >= 25 => 'adulto', $idade >= 18 => 'jovem adulto', default => 'criança', };

var_dump($resultado); // 'jovem adulto'

<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-4119206527475379" data-ad-slot="7774041254" data-ad-format="auto" data-full-width-responsive="true">

<script> (adsbygoogle = window.adsbygoogle || \[\]).push({}); </script>

Consistência para tipos de erros em funções internas do PHP

Nas versões anteriores do PHP, geralmente, quando se passava um argumento com valor não esperado para uma função, o mesmo gerava um "Warning".

Exemplo:

strlen([]);
// PHP Warning:  strlen() expects parameter 1 to be string, array given in script.php on line 3

Porém, a versão PHP 8.0 introduziu melhorias para esses casos. No exemplo acima, ao executar no PHP 8, receberíamos o lançamento de TypeError.

Exemplo:

strlen([]);

// PHP Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, array given in script.php:3

Sendo assim, é possível ainda capturar o TypeError, conforme desejado.

Exemplo:

try{
    strlen([]);
} catch (\TypeError $e) {
    var_dump($e);
}

Novas funções de verificações de string

O PHP 8.0 introduziu algumas funções novas de para verificação de string. Elas são str_contains, str_starts_with, str_ends_with, as quais são parecidas com as existentes em linguagens como Python e Javascript.

Exemplo da função str_contains

Nas versões anteriores do PHP, para verificar se uma string possuia determinada correspondência, utilizávamos a função strpos.

Veja:

foreach(['rato', 'barata', 'gato'] as $animal) {
    var_dump(strpos($animal, 'to') !== false);
}

Note que era necessário verificar se o retorno era diferente de false, pois strpos retornava o número referente a posição encontrada na string.

Porém, a função str_contains simplesmente retornará boolean caso a string seja ou não encontrada.

Exemplo:

foreach(['rato', 'barata', 'gato'] as $animal) {
    var_dump(str_contains($animal, 'to'));
}

// Resultado: // bool(true) // bool(false) // bool(true)

Exemplo da função str_starts_with

Nas versões anteriores do PHP, para verificar se uma string possuia determinada correspondência no iníco da mesma, também utilizávamos a função strpos.

foreach(['rato', 'barata', 'gato'] as $animal) {
    var_dump(strpos($animal, 'ra') === 0);
}

// bool(true) // bool(false) // bool(false)

Basicamente, teríamos que verificar se a posicão encontrada era igual a 0, pois como já tiro, essa função retorna um int, que representa a posição em que o termo foi encontrado na string alvo.

Já na versão 8, ficaria dessa forma:

foreach(['rato', 'barata', 'gato'] as $animal) {
    var_dump(str_starts_with($animal, 'ra'));
}

// bool(true) // bool(false) // bool(false)

Exemplo da função str_ends_with

Nas versões anteriores do PHP, para verificar se uma string possuia determinada correspondência no final da mesma, poderíamos utilizar a função substr_compare combinado com strlen.

Exemplo:

$termo = 'to';
foreach(['rato', 'barata', 'gato'] as $animal) {
    var_dump(
        substr_compare($animal, $termo, -strlen($termo)) === 0
    );
}

// bool(true) // bool(false) // bool(true)

No PHP 8, ficaria assim:

foreach(['rato', 'barata', 'gato'] as $animal) {
    var_dump(str_ends_with($animal, 'to'));
}

// bool(true) // bool(false) // bool(true)