PHP 8 - Novas funcionalidades, melhorias e potenciais problemas com WordPress

Marten Gülink Última atualização 11.01.2021
10 min.
php 8 major update
Última atualização 11.01.2021


O PHP 8 está aqui! A maior atualização foi lançada em 26 de novembro de 2020 e nos traz algumas mudanças fundamentais, assim como muitas novidades. Nosso desenvolvedor Marten explica em que caso o PHP 8 realmente leva a um melhor desempenho e se você já deve atualizar para a nova versão como um usuário WordPress :in.

Introdução ao PHP 8 

O PHP 8 foi apresentado pela primeira vez aos seus testadores alfa em 18 de junho de 2020 e está em congelamento desde julho. Portanto, não foi permitido adicionar novas adições até o lançamento em 26 de novembro. Uma característica única deste lançamento é que estamos pulando o PHP 7.5 e indo direto para o PHP 8. E este salto vem com muitas características. 

Uma das perguntas mais comuns sobre o PHP 8 que os usuários do WordPress provavelmente fazem é: O PHP 8 irá melhorar a performance do meu site?

A resposta a essa pergunta é (como tantas vezes acontece), "Depende...".

Quando o PHP foi atualizado da versão 5 para a versão 7, houve um enorme aumento de desempenho. Com o PHP 8, no entanto, você não verá uma melhoria de desempenho geral a menos que sua aplicação compute muitas funções matemáticas (veja nossa seção sobre o compilador JIT). Isto é principalmente porque a otimização do código PHP já está muito bem estabelecida.

Mas quem disse que o desempenho é limitado para compilar o tempo de qualquer maneira? Eu, como desenvolvedor, mediria a performance de várias maneiras, incluindo os recursos disponíveis para escrever código bem estruturado. E o PHP 8 está cheio de novidades. Então, vamos começar!

As novas funcionalidades mais importantes do PHP 8 

O PHP 8 tem oito novas funcionalidades principais que gostaria de vos apresentar brevemente: 

  1. O Compilador JIT 
  2. Atributos
  3. Argumentos Nomeados
  4. Expressões de jogo 
  5. Expressões de Lance
  6. Tipo de Retorno Estático 
  7. tipo de União 
  8. Tipos mistos 

O compilador JIT (just-in-time)(rfc)

Quando o código PHP é executado, normalmente é feito através da compilação de instruções virtuais que são executadas em uma máquina virtual. O JIT irá alterar isto compilando o código em código de máquina x86 e depois executando esse código directamente na CPU. Para aplicações que dependem muito de funções matemáticas, isso deve resultar em um aumento de desempenho. Contudo, isto não é esperado para aplicações web médias (ver gráfico). 

PHP 8 - Novas funcionalidades, melhorias e potenciais problemas com WordPress
Fonte

Para um exemplo dos ganhos de desempenho que podem ser alcançados através do JIT, é melhor assistir ao vídeo abaixo.

YouTube

Ao carregar o vídeo, você aceita a política de privacidade do YouTube.
Saiba mais

Carregar o vídeo

PGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tL2VtYmVkL2RXSDY1cG1uc3JJIiBhbGxvdz0iYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPSIiIHdpZHRoPSI1NjAiIGhlaWdodD0iMzE1IiBmcmFtZWJvcmRlcj0iMCI+PC9pZnJhbWU+

Basicamente, se você estiver usando PHP para uma tarefa matemática de trabalho intensivo, sua aplicação irá funcionar mais facilmente com a nova versão. Mas se você usa PHP como a maioria dos usuários do WordPress , você não notará muita mudança. Explico mais sobre o que PHP 8 significa para os proprietários do site WordPress abaixo. 

Passando para as novas funcionalidades:

Atributos v2(rfc, rfc)

Uma das novas funcionalidades do PHP 8 (que tem levado a muita discussão na comunidade PHP) são atributos - conhecidos como "anotações" em muitas outras linguagens. Atributos substituem a necessidade de armazenar metadados por blocos de documentos no PHP 8. Era a isto que você costumava recorrer para declarar metadados para classes, métodos, funções e argumentos de uma forma estruturada. 

Como você pode imaginar, usar comentários de código para aplicar metadados não foi o ideal, mas funcionou. Felizmente, não vamos ter esse problema agora. 

Os atributos podem ser definidos com a função Syntax #[...] declarado.

Aqui estão alguns exemplos da RFC de como os atributos podem ser aplicados a diferentes tipos de dados.

#[ExampleAttribute]
class Foo
{
    #[ExampleAttribute]
    public const FOO = 'foo';
 
    #[ExampleAttribute]
    public $x;
 
    #[ExampleAttribute]
    public function foo(#[ExampleAttribute] $bar) { }
}
 
$object = new #[ExampleAttribute] class () { };
 
#[ExampleAttribute]
function f1() { }
 
$f2 = #[ExampleAttribute] function () { };
 
$f3 = #[ExampleAttribute] fn () => 1;

Neste ponto, vale ressaltar que o RFC para Atributos sofreu uma série de mudanças desde sua concepção original, o que mostra o esforço e o pensamento que foram feitos nesta atualização. 

Argumentos Nomeados(rfc)

Osargumentos nomeados dão-lhe mais flexibilidade quando chama funções. Até agora, era necessário chamar uma função e passar cada argumento na ordem especificada pela função. 

// Using positional arguments:
array_fill(0, 100, 50);

Argumentos Nomeados permite que você defina um nome para cada parâmetro. E agora eles podem ser chamados fora de ordem, como descrito abaixo: 

// Using named arguments:
array_fill(start_index: 0, num: 100, value: 50);

Eles também podem ser acessados da seguinte forma:

array_fill(value: 50, num: 100, start_index: 0);

Um híbrido dos dois também é possível, permitindo a combinação de parâmetros nomeados e argumentos posicionais, melhorando a legibilidade do código: 

htmlspecialchars($string, double_encode: false);

Expressões de jogo(rfc)

Match Expressions destina-se a resolver alguns problemas de longa data na funcionalidade do seu predecessor, Switch. 

operador de comparação

Switch utiliza um operador relacional de conversão de tipo (==), o que pode causar problemas. Em contraste, a Match utiliza um operador de comparação rigoroso (====), independente dos tipos strict_types.

valor de retorno

As instruções de troca muitas vezes criam um valor que é necessário mais tarde no fluxo do programa. Pode acontecer que esse valor não esteja definido na declaração de mudança, o que pode posteriormente levar a problemas no script PHP. Além disso, a sintaxe do comando switch torna difícil a leitura de comandos de switch aninhados.

switch (1) {
    case 0:
        $y = 'Foo';
        break;
    case 1:
        $y = 'Bar';
        break;
    case 2:
        $y = 'Baz';
        break;
}
 
echo $y;
//> Bar

A nova expressão de partida elimina este problema ao atribuir o valor de retorno diretamente para cada ramo de partida(=>), o que é mais intuitivo. 

echo match (1) {
    0 => 'Foo',
    1 => 'Bar',
    2 => 'Baz',
};
//> Bar

Outono de 2004

Se uma declaração de mudança não tiver uma pausa após cada caso, ela continuará para o caso seguinte, mesmo que o código se quebre. Isto foi projetado para permitir que as funções de comutação executassem vários blocos de código em sequência. No entanto, esta tem sido uma fonte comum de erros. 

Match implementou uma quebra implícita após cada ramo (=>). Múltiplas condições podem agora ser executadas colocando vírgulas entre cada condição: 

match ($x) {
    1, 2 => {
        // Same for 1 and 2
    },
    3, 4 => {
        if ($x === 3) {
            // Only 3
        }
        // Same for 3 and 4
    },
}

Lançar expressões(rfc)

No PHP 8, a declaração de lançamento se tornou uma expressão. Isto significa que o lançamento pode agora tecnicamente devolver um valor. Isto é útil no sentido em que o lançamento pode agora ser usado em muito mais lugares, tais como as Funções de Seta ou os Operadores de Coalescer. 

Funções das setas: 

$callable = fn() => throw new Exception();

Coalesce Operadores: 

// $value is non-nullable.
$value = $nullableValue ?? throw new InvalidArgumentException();
 
// $value is truthy.
$value = $falsableValue ?: throw new InvalidArgumentException();

Operadores Ternários:

// $value is only set if the array is not empty.
$value = !empty($array)
    ? reset($array)
    : throw new InvalidArgumentException();

Tipo de Retorno Estático(rfc)

Como diz esta RFC, Static Return Type permite o retorno do nome da classe especial "static" de um método: "O nome da classe especial estática em PHP refere-se à classe que um método foi realmente chamado, mesmo que o método seja herdado. Isto é conhecido como "encadernação estática tardia" (LSB). Esta RFC propõe tornar a estática também utilizável como um tipo de retorno (ao lado dos já utilizáveis tipos self e parent)".

Estático não pode ser usado como parte de um parâmetro neste caso, no entanto. O retorno estático se referirá à classe que foi chamada. 

Tipos de União(rfc)

Tipos de União permitem declarar o tipo de valor que se espera de uma entrada. Em alguns idiomas, isto é chamado de esquema. Isto é feito de forma sintáctica, usando  | (por exemplo, o string|array|int) definido. Mas a magia não acaba aí, porque também se pode usar classes definidas como:

class MyClass {

}
function myFunction(string|array|int|MyClass){

}

Os tipos de união já são usados em PHP. No entanto, elas são implementadas usando o método de anotações phpdoc, como mostrado abaixo. 

class Number {
    /**
     * @var int|float $number
     */
    private $number;
 
    /**
     * @param int|float $number
     */
    public function setNumber($number) {
        $this->number = $number;
    }
 
    /**
     * @return int|float
     */
    public function getNumber() {
        return $this->number;
    }
}

Para um pouco mais de contexto sobre o uso, confira este exemplo da RFC:

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

Tudo isso se resume ao fato de que você pode usar vários tipos de entrada para a mesma função em vez de apenas uma, o que permite um maior grau de reusabilidade do código.

Tipos mistos(rfc)

Em versões recentes do PHP, foi possível declarar o tipo esperado de dados de entrada e retorno. No entanto, o PHP nem sempre suportava Tipos, e isso é um problema. Em alguns casos, um Tipo foi omitido ou simplesmente esquecido. OsTipos Mistostentam agora resolver este problema.

Um mixed tipo seria o equivalente a array|bool|callable|int|float|null|object|resource|string

Aqui está um exemplo da documentação da RFC de como isto é usado:

// Valid example
 
class A
{
    public function foo(int $value) {}
}
 
class B extends A
{
    // Parameter type was widened from int to mixed, this is allowed
    public function foo(mixed $value) {}
}

Características adicionais do PHP 8

Tornar estável a ordenação(rfc)

A estabilidade é adicionada a todas as funções que se enquadram em Sort (por exemplo.

sort, rsort, usort, asort, asort, arsort, uasort, ksort, krsort, uksort, array_multisort).

Eu recomendaria que você lesse isto nos documentos da RFC e o comparasse com a sua aplicação, já que mudar esta funcionalidade de instável para estável poderia impactar negativamente o seu código.

Promoção de Propriedade dos Construtores(rfc)

Esta funcionalidade deve ajudar a acelerar o seu fluxo de trabalho de desenvolvimento e reduzir os erros. Atualmente, a definição de um objeto de valores requer um conjunto de placas de caldeira, como mostrado abaixo na documentação da RFC:

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;
    }
}

Neste método, as propriedades devem ser repetidas três vezes. A melhoria para isto é a fórmula curta abaixo: 

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

Operador Seguro Zero(rfc)

Há um novo operador neste bloco! 

Em vez do clássico <code>!== nulo</code>, agora temos isto: <code>?->.</code> Parece estranho no início, mas se você olhar para isso do ponto de vista de encadeamento de "if-statements", a aplicação torna-se bastante clara: 

$country =  null;
 
if ($session !== null) {
    $user = $session->user;
 
    if ($user !== null) {
        $address = $user->getAddress();
 
        if ($address !== null) {
            $country = $address->country;
        }
    }
}
 
// do something with $country
$country = $session?->user?->getAddress()?->country;
 
// do something with $country

str_contains(rfc)

Esta nova função retorna um valor booleano (verdadeiro/falso) se uma string for encontrada em outra string. São necessários dois argumentos, o fio a ser pesquisado e o fio a ser pesquisado.

str_contains('php8', '8'); // true
str_contains('php8', 'wordpress'); // false

Para filtros de cordas ainda mais úteis, confira estas novas funcionalidades:

str_starts_with('haystack', 'hay'); // true
str_ends_with('haystack', 'stack'); // true

Estes dois retornarão um resultado booleano e trabalharão da mesma forma que str_contains().

Mapas Fracos(rfc)

No PHP, quando você define uma variável para o valor de um objeto, geralmente cria uma referência a esse objeto, mas não a um novo objeto. 

Então, neste caso, você pode acabar tendo muitas referências a um objeto, mas apenas um objeto. O problema com isso é: quando chegar a hora de apagar esse objeto, o PHP vai contar o número de referências que o objeto tem. E se for mais do que isso, o PHP se recusará a apagar esse objeto. 

Weak Maps resolve este problema criando uma referência "fraca" para o objecto correspondente. Uma vez apagado o objeto, todas as variáveis com a referência Weak Maps a esse objeto são definidas como zero. 

Capturas não Capturantes(rfc)

Um bloco de tentativas já é bastante impressionante quando se trata de reportar erros e agora existe uma forma ainda mais rápida de implementar isto. E não, isto não vai realmente afectar a legibilidade. 

O modo "old school" significava que você tinha que passar a sua exceção de captura para uma variável como esta:

function catchMeWhenIFall(){
	try {
        throw new Exception('NOPE - GRAVITY');
    } catch (Exception $e) {
        return $e->getMessage();
    }

}

Mas agora você não precisa definir a variável para passar para o seu bloco de captura.

try {
	throw new Exception('FOO!');
 catch  (){
	//Do some code here
 }

}

Mais material de leitura do PHP 8

Se você quiser saber mais sobre o lançamento do PHP 8 ou confira os exemplos de código RFC por si mesmo, basta dar uma olhada no anúncio de lançamento oficial. 

Você está pronto para o PHP 8? 

Nenhum desenvolvedor é fã de atualizações com grandes mudanças (lembramos WordPress 5.0 e Gutenberg), onde há o risco de que seu código se quebre e horas de trabalho ou uma reconstrução completa o espere. No entanto, se o seu código funcionou bem com o PHP 7.4, você não deve ter problemas com o PHP 8 (mais sobre PHP e WordPress no próximo capítulo). 

No entanto, se você estiver executando uma versão antiga do PHP, você deve verificar a lista de recursos depreciados antes de atualizar. Veja a documentação "Appendices" do PHP para uma lista completa de recursos anteriores, alterações e problemas ao atualizar de uma versão do PHP para a próxima. 

Você deve atualizar seu WordPress para o PHP 8? 

Para bases de código bem digitadas ou bases de código que tenham se mantido atualizadas com as últimas versões do PHP, não há um grande problema [migrar para o PHP 8]. A realidade, no entanto, é que WordPress não é uma base de código.

Omar Reiss, o levedura

Esta citação do Yoast "WordPress e do Relatório de Compatibilidade do PHP 8" já sugere que você como usuário WordPress :in não deve tratar a atualização para o PHP 8 de forma leve. A conclusão do relatório reforça essa suposição, como Omar Reiss escreve: "Investigando apenas um subconjunto de mudanças de quebra no PHP 8 já poderíamos confirmar que isso provavelmente causará grandes quebras em sites com origem pouco clara dessa quebra. Muitas vezes o erro ocorre em um lugar, mas é causado por um plugin ou theme em um lugar diferente, tornando estes problemas difíceis de serem depurados".

Estes problemas de compatibilidade são também uma razão pela qual o PHP 8 não está imediatamente disponível no painel RAIDBOXES para os nossos clientes. Especialmente depois de grandes atualizações, é sempre uma boa idéia dar aos desenvolvedores do Plugin tempo suficiente para fazer quaisquer ajustes necessários e esperar pelo momento. Assim que tivermos a certeza que não existem problemas com uma instalação padrão WordPress e que o PHP 8 funciona de forma estável e performante no nosso sistema, é claro que iremos disponibilizar o PHP 8.

Se você já tem acesso ao PHP 8 e quer testar a nova versão com o seu site WordPress , você deve - como antes de cada atualização - primeiro criar uma cópia de segurança. Como testar corretamente uma nova versão do PHP em RAIDBOXES pode ser lido neste artigo do Helpcenter (aqui usando o PHP 7.2 como exemplo).

A nossa conclusão

O PHP 8 é um grande passo à frente dos seus predecessores. Embora você possa não ver uma melhoria dramática na performance imediatamente (dependendo de como você usa o PHP 8), você deve considerar a atualização - pelo menos depois de tê-la testado, ela é estável, e está disponível no seu host WordPress . A nova versão é uma progressão natural e, ao implementá-la mais cedo do que mais tarde, estará a criar uma base sólida para futuras melhorias, crescimento e desempenho futuro.

Mais perguntas sobre o PHP 8?

Espero ter sido capaz de vos apresentar as novas e excitantes funcionalidades do PHP 8 com este artigo. Você tem mais perguntas sobre o assunto? Esteja à vontade para usar a função de comentários. Você quer mais dicas sobre WordPress , web design e muito mais? Depois siga-nos no Twitter, Facebook ou através da nossa newsletter.

Como desenvolvedor web em RAIDBOXES , Marten está sempre trabalhando em novos recursos para nossos clientes. Em "wp unboxed" ele também pontua com seus conhecimentos sobre desenvolvimento web, WordPress e nosso painel de controle. E em seu tempo livre ele também gosta de lidar com a auto-hospedagem e as últimas tendências na internet.

Artigos relacionados

Comentários sobre este artigo

Escreve um comentário

O teu endereço de e-mail não será publicado. Os campos obrigatórios estão marcados com *.