O que há de novo e emocionante no PHP 8 4

O que há de novo e emocionante no PHP 8 4

No momento em que nascente cláusula foi escrito, o PHP 8.4 estava no ciclo de lançamento beta, portanto podemos finalmente iniciar a discutir o que há de novo no próximo lançamento do PHP. Neste cláusula, discutiremos o cronograma para o lançamento e discutiremos alguns novos recursos e mudanças que podemos esperar ver.



Universal

No momento em que nascente cláusula foi escrito, o PHP 8.4 estava programado para ser lançado em 21 de novembro de 2024, depois passar pelas fases princípio, beta e candidato a lançamento. É sempre verosímil que a data mude, pois preferimos que eles lancem um software funcional do que um pouco com um bug. Isso aconteceu com o lançamento do 8.2, quando um bug crítico foi encontrado pouco antes do lançamento.

O que está incluso nesta versão tornará mais fácil para nós desenvolver e manter nosso código, porquê ganchos de propriedade. Uma vez que esta é uma versão pontual, não se espera que seja uma atualização dolorosa, mas planeje adequadamente, pois isso não é reservado.

Tenho duas isenções de responsabilidade antes de prosseguirmos. Leste cláusula foi feito usando a versão beta 3 no imagem solene do Docker mas a funcionalidade pode mudar entre agora e o lançamento real. Também não posso enfatizar o suficiente para não instalar isso em produção ainda. Qualquer tempo depois dos candidatos a lançamento, começarei a incluí-lo em meus testes automatizados para que possamos ver se um pouco quebra, mas esperarei até o primeiro patch (que será 8.4.1 neste caso) antes de começarmos a instalá-lo em QUALQUER envolvente de produção.

Se você estiver interessado em testar agora, há imagens do Docker disponíveis e instruções para compilá-lo diretamente do código-fonte.

Vamos falar sobre algumas das coisas que foram adicionadas.

Ganchos de propriedade

Um dos recursos mais amplamente discutidos que chegam ao PHP 8.4 são os Property Hooks. Os Property Hooks nos permitem juntar comportamento de uma forma que seja específica para uma única propriedade, permitindo que esse comportamento não interfira com aspectos existentes do PHP.

Na prática, podemos usar ganchos de propriedade definindo um set e get operação que será realizada ao definir ou obter uma propriedade.

A maneira clássica de contornar isso antes do PHP 8.4 era usar um par getter/setter ou lógica dentro do pegar()/Métodos Mágicos set(). Mas estes tinham desvantagens.

Com um setter e um getter, você tinha que manter um setter e um getter, e com os Métodos Mágicos, isso quebraria as ferramentas de estudo estática.

Tenho dois exemplos favoritos de porquê ganchos de propriedade podem ser usados.

A primeira é que podemos ter uma classe de usuário onde estamos rastreando um primeiro e último nome, mas temos ocasiões em que queremos obter e definir o nome completo. Nota: Peguei isso do RFC e modifiquei um pouco, pois é um ótimo exemplo!

“`
classe Usuário
{
função pública __construct(string pública $primeiro, string pública $último) {}

public string $fullName {
    // Override the "read" action with arbitrary logic.
    get => "{$this->first} {$this->last}";

    // Override the "write" action with arbitrary logic.
    set { 
        [$this->first, $this->last] = explode(" ", $value, 2);
    }
}

}

$usuário = novo usuário(“Scott”, “Keck-Warren”);
// saída:
// Scott Keck-Warren
repercussão $usuário->nomecompleto, PHP_EOL;

$usuário->nomecompleto = “Joe Keck-Warren”;
// saída:
//João
// Keck-Warren
repercussão $usuário->primeiro, PHPTermo da vida útil;
repercussão $usuário->último, PHP
Termo da vida útil;
“`

Uma vez que você pode ver no exemplo, substituímos o ponto e vírgula final da propriedade por um conjunto de código ({}) onde portanto colocamos o gancho de propriedade.

Não somos obrigados a definir set e get e, ao excluir um ou outro, podemos tornar a propriedade somente leitura ou somente gravação.

“`
classe Usuário
{
função pública __construct(string pública $primeiro, string pública $último) {}

public string $fullName {
    // Override the "read" action with arbitrary logic.
    get => "{$this->first} {$this->last}";
}

}

$usuário = novo usuário(“Scott”, “Keck-Warren”);
// saída: Erro não detectado: Propriedade User::$fullName é somente leitura
$usuário->nomecompleto = “Joe Keck-Warren”;
“`

“`
classe Usuário
{
função pública __construct(string pública $primeiro, string pública $último) {}

public string $fullName {
    // Override the "write" action with arbitrary logic.
    set { 
        [$this->first, $this->last] = explode(" ", $value, 2);
    }
}

}

$usuário = novo usuário(“Scott”, “Keck-Warren”);
// saída:
// Propriedade User::$fullName é somente para gravação
repercussão $usuário->nomecompleto, PHP_EOL;
“`

Não tenho 100% de certeza, mas acho que essa é a única maneira de fabricar uma propriedade somente gravação.

A outra lógica para a qual isso será extremamente útil é validar se o valor está “correto”.

“`
classe Usuário
{
função pública __construct(string pública $primeiro, string pública $último) {}

public int $stateId = 0 {
    // Override the "write" action with arbitrary logic.
    set { 
        if ($value < 0) {
            throw new Exception("stateId must be greater than 0");
        }

        $this->stateId = $value;
    }
}

}

$usuário = novo usuário(“Scott”, “Keck-Warren”);
// saída:
// Exceção não capturada: stateId deve ser maior que 0
$usuário->stateId = -1;
“`

Leste é um exemplo trivial, mas será perfeito para Máquinas de Estados Finitos porque podemos validar se a transição é válida antes de permitir que ela ocorra.

Funções de matriz

O PHP 8.4 também está adicionando novas funções que tornarão mais fácil para nós pesquise nossas matrizes sem ter que redigir muito código clichê.

array_encontrar

A primeira função que vamos discutir é a array_find função que retorna o valor do primeiro elemento para o qual uma função de retorno de chamada personalizada retorna true. Se nenhuma correspondência for encontrada, a função retornará null.

“`
$nomes = [
“Scott”,
“Samuel”,
“Sarah”,
“Shanon”,
];

// saída:
// Samuel
repercussão array_find(
matriz: $nomes,
retorno de chamada: fn (string $nome) => strlen($nome) == 6
);
“`

variedadeencontrarchave

O array_find_key function retorna a chave do primeiro elemento para o qual uma função de retorno de chamada personalizada retorna true. Se nenhuma correspondência for encontrada, a função retornará null.

“`
$nomes = [
“Scott”,
“Samuel”,
“Sarah”,
“Shanon”,
];

// saída:
// 1
matriz de repercussãoencontrarchave(
matriz: $nomes,
retorno de chamada: fn (string $nome) => strlen($nome) == 6
);
“`

matriz_qualquer

O array_any function retorna true se qualquer elemento para o qual uma função de retorno de chamada personalizada retorna true. Se nenhuma correspondência for encontrada, a função retornará false.

“`
$nomes = [
“Scott”,
“Samuel”,
“Sarah”,
“Shanon”,
];

// saída:
// verdadeiro
repercussão array_any(
matriz: $nomes,
retorno de chamada: fn (string $nome) => strlen($nome) == 6
) ? “verdadeiro” : “falso”;

// saída:
// falso
repercussão array_any(
matriz: $nomes,
retorno de chamada: fn (string $nome) => strlen($nome) == 60
) ? “verdadeiro” : “falso”;
“`

matriz_tudo

Finalmente, o array_all função retorna o true se TODOS os elementos para uma função de retorno de chamada personalizada retornarem true. Se qualquer elemento fizer com que o retorno de chamada retorne false, ele retornará false.

“`
$nomes = [
“Scott”,
“Samuel”,
“Sarah”,
“Shanon”,
];

// saída:
// verdadeiro
repercussão array_all(
matriz: $nomes,
retorno de chamada: fn (string $nome) => strlen($nome) <= 6
) ? “verdadeiro” : “falso”;

// saída:
// falso
repercussão array_all(
matriz: $nomes,
retorno de chamada: fn (string $nome) => strlen($nome) == 6
) ? “verdadeiro” : “falso”;
“`

new MyClass()->method() sem parênteses

Antes do PHP 8.4, se você quisesse fabricar uma instância de uma classe e portanto invocar um método na classe recém-instanciada, você poderia fazer isso colocando o “new” entre parênteses.


$value = (new User("Scott", "Keck-Warren"))
->fullName;

O PHP 8.4 muda isso para que possamos excluir os parênteses o que deve tornar muito mais fácil ler e redigir.


echo new User("Scott", "Keck-Warren")
->fullName;

Uma das partes mais interessantes do RFC foi o vestimenta de que, por culpa dessa mudança, “mais de meio milhão de linhas de código PHP de código ingénuo puderam ser simplificadas” exclusivamente em projetos de código ingénuo. Ficarei interessado em ver que efeito isso realmente tem.

#[Deprecated] Atributo

A seguir, um novo atributo está sendo adicionado para nos permitir marcar funções, constantes de classe e casos de enumeração porquê obsoletos. As funções e constantes internas do PHP podem ser marcadas porquê obsoletas, mas o #[Deprecated] O atributo agora nos permitirá marcar código obsoleto e ele será tratado porquê tal.

“`
}

// saída:
// Obsoleto: A função test() está obsoleta em …
teste();
“`

Esta era uma funcionalidade que podíamos replicar antes da versão 8.4 usando trigger_error() mas será muito melhor ter a funcionalidade facilmente alcançável (principalmente porque eu nunca conseguia lembrar qual “nível” de erro eu precisava passar).

Adicione 4 novos modos de arredondamento à função round()

Também são novidades no PHP 8.4 quatro novos modos de arredondamento para o round() função. Se você for porquê eu, você nem sabia disso round() permitiu que você especificasse porquê o arredondamento deveria Sua visita nos ajuda a continuar oferecendo o melhor para você! feito.

Os novos modos nos permitem arredondar para o inteiro mais próximo maior que o número (PHPREDONDOCEILING), arredondado para o inteiro mais próximo menor que o número (PHPREDONDOFLOOR), sempre arredondado para longe de zero (PHPREDONDOAUSENTEDEZERO), e sempre arredondado para zero (PHPREDONDOEM DIREÇÃO A ZERO).

Essas adições serão úteis para qualquer pessoa que faça matemática.

Outros

Outras coisas que foram alteradas e que gostaria de mencionar brevemente são:

Melhorias ext-dom

O PHP 8.4 traz melhorias para o extensão ext-dom incluindo suporte a HTML 5. Talvez tenhamos que redigir um cláusula sobre a extensão ext-dom em qualquer momento, pois ela pode ser útil para qualquer um que esteja tentando averiguar dados de um site.

Juntar http(obter|limpar)perseverarrespostafunção headers()

Duas funções foram adicionadas para torná-lo mais fácil trabalhar com respostas HTTP. Essas funções são as http_get_last_response_headers() e http_clear_last_response_headers() que nos permitem obter e limpar os erros.

Isso está sendo feito para que o $http_response_header variável pode ser removida do PHP, portanto se você estiver usando $http_response_header agora seria a hora de iniciar a limpar isso.

Adições multibyte

Funções multibyte foram adicionadas para mourejar com Sua visita nos ajuda a continuar oferecendo o melhor para você! target="_blank" href="https://wiki.php.net/rfc/mb_ucfirst">caso e aparar lógica que não é suportada atualmente.



// output:
// string(5) "Scott"
var_dump(mb_ucfirst("scott"));
// output:
// string(5) "sCOTT"
var_dump(mb_lcfirst("SCOTT"));
// output:
// string(5) "Scott"
var_dump(mb_trim(" Scott "));
// output:
// string(9) "Scott "
var_dump(mb_ltrim(" Scott "));
// output:
// string(8) " Scott"
var_dump(mb_rtrim(" Scott "));

Descompacte ext/imap, ext/pspell, ext/oci8 e ext/PDO_OCI

Em 8.4 as extensões ext/imap, ext/pspell, ext/oci8 e ext/PDO_OCI não farão mais secção da distribuição de código-fonte do PHP e será transferido para PECL.

Aumentando o dispêndio padrão do BCrypt

O dispêndio padrão para BCrypt em password_hash() mudou para mourejar com o vestimenta de que os computadores continuam a permanecer cada vez mais rápidos. Se você estiver usando password_hash() com os parâmetros padrão você não deve ter que mudar zero, mas você deve ter certeza de que também está usando password_needs_rehash() para ver se a senha atual precisa ser refeita, pois isso só será útil se você estiver usando ambas.

Depreciações

Também havia algumas partes da linguagem que estavam obsoletas e serão removidas no PHP 9. Espero que o Rector consiga substituí-las maquinalmente para nós.

Suspender tipos de parâmetros implicitamente anuláveis

O que eu acho que terá o maior impacto na maioria dos desenvolvedores é a mudança na forma porquê o PHP cria maquinalmente tipos anuláveis ​​implícitos.

Atualmente, podemos fabricar um parâmetro para uma função que pode ser do tipo nulo e especificar que o valor padrão é nulo.


function test(User $user = null) {
//
}

Nos bastidores, o PHP estava convertendo isso em um pouco mais parecido com o seguinte:


function test(?User $user = null) {
//
}

É uma diferença pequena, mas é mais “correta”.

Esta mudança no PHP 8.4 irá interromper a funcionalidade que permite que isso aconteça com a teoria de que será removida no PHP 9.0. Você receberá uma mensagem que diz “Deprecated: test(): Implicitly marking parameter $user as nullable is deprecated, the explicit nullable type must be used instead”

O que você precisa saber

  1. O PHP 8.4 está programado para ser lançado em 21 de novembro de 2024
  2. As principais mudanças incluem ganchos de propriedade e novas funções de matriz

Tags:

Crédito: Nascente Original

Adriano Pina

Adriano Pina

Análise de Sistemas | SEO e Google Ads | Fundador da Loja Script PHP Aqui & Marca Shoslh de tecnologia

Especialista em transformar ideias em soluções digitais e acelerar o crescimento online.

Deixe um comentário

Tem perguntas? Nos envia sua mensagem 24/7!

(17) 99100-0874

Endereço & Contato

Centro, Interior de São Paulo
E-mail: [email protected]

Links Úteis
BAIXAR APP | SCRIPT PHP AQUI
Certificados
0
    0
    Seu carrinho
    Seu carrinho está vazio

    Usamos cookies para garantir que oferecemos a melhor experiência em nosso site. 

       

    X

    Clique em um de nossos representantes abaixo para conversar no WhatsApp ou envie um email para: 📧 [email protected]

    Precisa de ajuda fale conosco?