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
- Site oficial do PHP - https://www.php.net/manual/en/migration84.new-features.php#migration84.new-features.core.asymmetric-property-visibility
- Release - https://www.php.net/releases/8.4/en.php
- Laravel News - https://laravel-news.com/php-8-4-0
Massa 🚀, mais duas coisas interessantes dessa nova versão são:
-
Novas funções
array_find()
,array_find_key()
,array_any()
, earray_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
-
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.
Muito interessante! Procurei por "property hooks" no contexto do Kotlin, gostaria de ver um exemplo de como funciona lá
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 🐘🚀