PHP 8.4 oficialmente lançado cheio de novidades

O PHP 8.4 acaba de ser lançado e trás, além de diversas melhorias da linguagem, novas features para facilitar a vida do desenvolvedor. Entre elas estão: Property Hooks, Asymmetric Property Visibility, Lazy Objects e Class Instantiation without extra parenthesis.

Property Hooks

Inspirada em linguagens como C#, Kotlin e Swift, as property hooks permitem definir os métodos getters e setters diretamente na declaração dos atributos, como no exemplo abaixo:

class User implements Named
{
    private bool $isModified = false;
 
    public function __construct(
        private string $first,
        private string $last
    ) {}
 
    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);
            $this->isModified = true;
        }
    }
}

Asymmetric Property Visibility

Agora é possível definir separadamente a visibilidade do get e set das propriedades dos objetos

class Book
{
    public function __construct(
        public private(set) string $title,
        public protected(set) string $author,
        protected private(set) int $pubYear,
    ) {}
}
 
class SpecialBook extends Book
{
    public function update(string $author, int $year): void
    {
        $this->author = $author; // OK
        $this->pubYear = $year; // Fatal Error
    }
}
 
$b = new Book('How to PHP', 'Peter H. Peterson', 2024);
 
echo $b->title; // How to PHP
echo $b->author; // Peter H. Peterson
echo $b->pubYear; // Fatal Error

Lazy Objects

Agora é possível instanciar classes sem informar os parâmetros obrigatórios do construtor, sendo possível fazê-lo mais tarde. Isso permite que os frameworks utilizem ainda mais a injeção de dependência, veja o exemplo abaixo:

class Example
{
    public function __construct(private int $data)
    {
    }

    // ...
}

$initializer = static function (Example $ghost): void {
    // Fetch data or dependencies
    $data = ...;
    // Initialize
    $ghost->__construct($data);
};

Class Instantiation without extra parenthesis

Antes do PHP 8.4, ao instaciar uma classe, era necessário embrulhá-la entre parênteses para poder acessar métodos ou propriedades. Agora, não será mais necessário, tornando o acesso mais simples.

  • Antes PHP 8.4
// Wrapping parentheses are required to access class members
$request = (new Request())->withMethod('GET')->withUri('/hello-world');
  • Após PHP 8.4
// PHP Parse error (<= PHP 8.3): syntax error, unexpected token "->"
$request = new Request()->withMethod('GET')->withUri('/hello-world');

Fontes

Massa 🚀, mais duas coisas interessantes dessa nova versão são:

  • Novas funções array_find(), array_find_key(), array_any(), e array_all()

  • Nova classe BcMath\Number para lidar com números usando orientação a objetos e operadores matemáticos padrão, sem perder a precisão:

    • Sem BcMath\Number:

      $num1 = '0.12345';
      $num2 = 2;
      $result = bcadd($num1, $num2, 5);
      
      echo $result; // '2.12345'
      var_dump(bccomp($num1, $num2) > 0); // false
      
    • Com BcMath\Number:

      $num1 = new Number('0.12345');
      $num2 = new Number('2');
      $result = $num1 + $num2;
      
      echo $result; // '2.12345'
      var_dump($num1 > $num2); // false
      
Curioso que é um número, mas o parâmetro espera uma string rsrs (aceita int também)

Eu praticamente aprendi a programar com PHP, e era algo cheio de gambiarras e coisas antigas. Fiquei com um certo preconceito por causa disso (acredito que várias pessoas também hehe). Hoje, eu trabalho em uma multinacional (não vou dizer o nome, mas é aquela verdinha de materiais de construção) onde o e-commerce é feito todo em PHP com Laravel. Quando entrei no projheto, confesso que fiquei um pouco pensativo, pois estaria voltando para uma linguagem antiga, sem futuro. Eu estava redondamente enganado kk. Hoje PHP é muito bom (talvez era quando eu estava aprendendo também, eu que não sabia). Não vou entrar em muitos detalhes, mas quem tem esse preconceito, eu aconselharia a dar mais uma chance. Talvez se surpreenda.

Eu tinha esse mesmo pensamento... Alguns dizem que saber PHP só é útil para migrar projeto legado, mas vejo vários conhecidos ai ganhando bastante com PHP. Inclusive perdi uma vaga por não conhecer o PHP. PHP ser inútil e antigo é provavelmente uma das maiores mitos da comunidade que se pendura até hoje.
Cara, eu aprendi programação por meio do PHP 5.4 lá em 2015, eram outros tempos... Assistia aula e o prof colocava queries sql no meio do html e tudo mais, porém foi ali que fui aprendendo de pouco em pouco como as coisas funcionavam. Claro que já existia orientação a objetos, mvc, padrões etc. Outras linguagens fortemente tipadas ou com raiz forte em orientação a objetos já faziam isso há muito tempo, e poucos programadores PHP já estavam por dentro desse conceito. Mas com o tempo, e com a ajuda dos frameworks trazendo uma forma mais organizada de se trabalhar, fomos aprendendo a utilizar os padrões de projeto para chegar no código que conseguimos escrever lindamente hoje. O pessoal que vem do C# ou Java tem que compreender que toda linguagem e seus programadores tem seu amadurecimento. Acredito que na época que aprendi, nem o professor do youtube sabia orientação a objetos. Hoje, utilizando PHP 8.3, Laravel 11, Livewire 3, TailwindCSS, e um pouquinho de JS, não tem coisa melhor para se criar uma aplicação web. Foram feitos para isso, nem pra desktop, nem mobile, mas para exatamente isso. É simplesmente ótimo!
Até porque o C# tenta imitar o PHP com var, dynamic e ExpandoObject. Java também apesar de mais restritivos tmb oferece meios de se chegar. inclusive na v20 adicionou o var pra inferência dinâmica. Enfim, muita gente reclama do PHP pela a forma de tipagem e inferencia, só que lá no fundo, todo mundo quer usar a forma de se programar com PHP. então nada melhor do que a versão 8 do PHP trouxe. A facilidade de se programar com ele, podendo utilizar os recursos das outras linguagens

Que daora vey, PHP ta ficando cada vez mais foda.

Muito interessante! Procurei por "property hooks" no contexto do Kotlin, gostaria de ver um exemplo de como funciona lá

Então, eu não entendo de Kotlin, esse resumo foi trazido pelo Laravel News, mas o que achei de mais parecido foram os métodos get e set do Kotlin aqui https://medium.com/@annarafadev/kotlin-getters-and-setters-d6a4c804252a

Muito legais essas novas funcionalidades! Aprendi a programar em PHP3 e ele não parou de evoluir. Cada lançamento é uma evolução interessante, mas acredito que o PHP precisa implementar algo como Generics e async/await... Tomara que não demorem muito. Independentemente disso, o framework Laravel e o CMS WordPress têm e manterão o PHP por muito tempo na esteira de desenvolvimento, pois são duas ferramentas excelentes (Laravel é fantástico ao meu ver). Eu não via php desde o PHP4, soube que ele ficou respirando por aparelhos na versão 6, e depois só voltei já na versão 8 e me surpreendi muito com toda evolução parecendo-se muito com Java, mas sem a verbosidade... Acho que devido os problemas advindos na versão 6 tenham impactado a sua credibilidade, mas vejo com bons olhos essas novidades cada vez mais impactantes e robustas.

Parabéns pelo post e por promover a linguagem PHP 🐘🚀

Muito obrigado, meu querido. Tenho paixão por essa linguagem que me inseriu no contexto que vivo hoje e me trouxe tantas oportunidades. Sempre aprendendo um pouquinho aqui e ali de outras linguagens para compor a minha caixinha de ferramentas, mas nunca deixando o bom e velho PHP de lado.