image

Access unlimited bootcamps and 650+ courses forever

60
%OFF
Article image
Stephen Roque
Stephen Roque22/11/2024 17:21
Share

PHP 8.4: O Futuro do Desenvolvimento Web está Aqui!

  • #PHP

O PHP 8.4 chegou trazendo uma série de novidades que prometem revolucionar o desenvolvimento de aplicações web. Lançado oficialmente em 21 de novembro de 2024, esta versão introduz novos recursos, melhorias de desempenho e mudanças que irão impactar diretamente o trabalho dos desenvolvedores.

Principais Novidades do PHP 8.4

1. Hooks de Propriedade

Agora é possível adicionar ganchos a propriedades de classes. Com isso, você pode executar lógica personalizada ao acessar ou modificar uma propriedade, eliminando códigos repetitivos e tornando as classes mais expressivas.

<?php
class Person
{
  // Propriedade virtual que retorna o nome completo.
  public string $fullName {
      get => $this->firstName . ' ' . $this->lastName; // Combina primeiro e último nome ao acessar.
  }

  // Hook para definir o primeiro nome, ajustando a capitalização automaticamente.
  public string $firstName {
      set => ucfirst(strtolower($value)); // Primeiro caractere em maiúsculo, o restante em minúsculo.
  }

  // Hook para validar e definir o último nome.
  public string $lastName {
      set {
          if (strlen($value) < 2) { // Verifica se o nome tem pelo menos 2 caracteres.
              throw new \InvalidArgumentException('Too short'); // Lança uma exceção caso seja muito curto.
          }
          $this->lastName = $value; // Define o valor após a validação.
      }
  }
}

$p = new Person();
$p->firstName = 'stephen'; // Define o primeiro nome com capitalização automática.
print $p->firstName; // Imprime "Stephen".
$p->lastName = 'Roque'; // Define o último nome após validação.
print $p->fullName; // Imprime "Stephen Roque".

2. Visibilidade Assimétrica

Uma grande novidade para controle de acesso às propriedades. Com a visibilidade assimétrica, você pode definir níveis diferentes para leitura e escrita, por exemplo, permitindo que uma propriedade seja apenas lida externamente, mas modificada internamente.

<?php
class Example
{
  // O primeiro modificador de visibilidade controla o get-visibility, e o segundo modificador.
  // controla a visibilidade definida. O get-visibility não deve ser mais estreito que o set-visibility.
  public protected(set) string $name;

  public function __construct(string $name)
  {
      $this->name = $name; // Escrita permitida dentro da classe.
  }
}

$example = new Example('PHP 8.4');
// $example->name = 'PHP 8.3'; // Lança erro, escrita é protegida.
echo $example->name; // Leitura permitida, imprime "PHP 8.4"

3. Atributo #[\Deprecated]

Este novo atributo emite avisos de depreciação ao usar elementos marcados como obsoletos, facilitando a transição para códigos mais modernos e compatíveis com futuras versões.

<?php
class PhpVersion
{
  #[\Deprecated(
      message: "use PhpVersion::getVersion() instead",
      since: "8.4",
  )]
  public function getPhpVersion(): string
  {
      return $this->getVersion();
  }

  public function getVersion(): string
  {
      return '8.4';
  }
}

$phpVersion = new PhpVersion();
// Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use PhpVersion::getVersion() instead.
echo $phpVersion->getPhpVersion();

4. Suporte HTML5 no DOM

O novo Dom\HTMLDocument permite trabalhar com HTML5 de forma nativa, garantindo parsing mais moderno e suporte a seletores CSS diretamente na manipulação de DOM.

<?php
$dom = Dom\HTMLDocument::createFromString(
  <<<HTML
      <main>
          <article>PHP 8.4 is a feature-rich release!</article>
          <article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
      </main>
      HTML,
  LIBXML_NOERROR,
);

$node = $dom->querySelector('main > article:last-child'); // Seleciona o último elemento <article>.
var_dump($node->classList->contains("featured")); // Verifica se a classe "featured" está presente, retorna bool(true).

5. Nova API para BCMath

Com a classe BcMath\Number, agora é possível usar sobrecarga de operadores em cálculos matemáticos, melhorando a legibilidade e reduzindo a complexidade dos cálculos.

<?php
use BcMath\Number;

$num1 = new Number('0.12345');
$num2 = new Number('2');
$result = $num1 + $num2;

echo $result; // Imprime '2.12345'.
var_dump($num1 > $num2); // Compara os números, retorna false.

6. Novas Funções de Arrays

Funções como array_findarray_all e array_any simplificam a manipulação de arrays, permitindo buscas e validações de forma mais intuitiva.

<?php
$animal = array_find(
  ['dog', 'cat', 'cow', 'duck', 'goose'],
  static fn (string $value): bool => str_starts_with($value, 'c'), // Busca elementos que começam com "c".
);

var_dump($animal); // string(3) "cat".

7. Objetos Preguiçosos (Lazy Objects)

Agora, o PHP suporta criação de objetos que são inicializados somente quando necessários, otimizando o uso de memória e desempenho.

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

  // Método adicional (omitido por simplicidade).
}

$initializer = static function (Example $ghost): void {
  // Simula a obtenção de dados.
  $data = 42; // Dados fictícios.
  $ghost->__construct($data); // Inicializa o objeto quando necessário.
};

$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer); // Cria um Lazy Object.

8. Subclasses Específicas de Driver no PDO

Foram introduzidas subclasses específicas para drivers no PDO (PHP Data Objects), uma mudança significativa para quem trabalha com banco de dados. Com essas subclasses, agora é possível utilizar APIs mais restritivas e expressivas, garantindo maior clareza e segurança ao interagir com diferentes bancos de dados. Essa atualização ajuda a evitar erros e promove uma melhor integração com as peculiaridades de cada driver.

<?php
$connection = PDO::connect(
  'sqlite:foo.db', // Conexão SQLite
  $username,
  $password,
); // Retorna um objeto PDO\Sqlite.

$connection->createFunction(
  'prepend_php',
  static fn ($string) => "PHP {$string}" // Cria uma função personalizada.
); // Disponível apenas no driver correspondente.

$connection->query('SELECT prepend_php(version) FROM php'); // Executa uma consulta usando a função personalizada.

9. Sintaxe Melhorada

É possível instanciar uma classe e chamar métodos diretamente sem parênteses, melhorando a leitura de códigos mais encadeados.

<?php
class PhpVersion
{
  public function getVersion(): string
  {
      return 'PHP 8.4';
  }
}

var_dump(new PhpVersion()->getVersion());

Melhorias de Desempenho e Depreciações

O PHP 8.4 também foca em eficiência e segurança, trazendo melhorias no Just-In-Time Compiler (JIT) e mudanças na maneira como tipos nulos implícitos são tratados. Além disso, algumas extensões foram movidas para o PECL, e recursos antigos foram definitivamente removidos.

Por que Atualizar para o PHP 8.4?

Com mais de 2.600 commits de 115 desenvolvedores, o PHP 8.4 é uma evolução pensada para atender às necessidades do desenvolvimento moderno. Seus novos recursos não só aumentam a produtividade, mas também garantem maior desempenho e compatibilidade com frameworks populares.

Mais informações, consulte as notas de lançamento oficiais.

Para acompanhar mais insights sobre PHP, desenvolvimento web e tecnologia, conecte-se comigo no LinkedIn! 🚀 Stephen Roque

Share
Comments (0)