PHP 8.4 was released on November 21, 2024. Today is… well, let’s just say it’s been a while.

As we say in French: mieux vaut tard que jamais — better late than never. And let’s be honest, when you’re juggling production projects, client deadlines, and that one legacy codebase that refuses to die, upgrading PHP isn’t always day-one priority.
But here we are! And I’m genuinely excited to share these features with you — even if half of you have probably been using them in production for months. No judgment from me. Okay, maybe a little judgment towards myself.
🪝Property Hooks — The Game Changer
Property hooks might be the biggest quality-of-life improvement since constructor property promotion. I’m not being dramatic — this genuinely changes how I write classes.
No more boilerplate getters. No more repetitive setters. You define the logic directly on the property itself.
Before PHP 8.4, a simple class with
getters & seters looked like this:class Player {
private string $email;
private string $firstName;
private string $lastName;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Invalid email format');
}
$this->email = $email;
}
public function getFirstName(): string {
return $this->firstName;
}
public function setFirstName(string $firstName): void {
if (empty(trim($firstName))) {
throw new InvalidArgumentException('First name cannot be empty');
}
$this->firstName = trim($firstName);
}
public function getLastName(): string {
return $this->lastName;
}
public function setLastName(string $lastName): void {
if (empty(trim($lastName))) {
throw new InvalidArgumentException('Last name cannot be empty');
}
$this->lastName = trim($lastName);
}
public function getFullName(): string {
return $this->firstName . ' ' . $this->lastName;
}
}As of PHP 8.4, all of that boilerplate can be reduced to this:
class Player {
public string $email {
set {
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Invalid email format');
}
$this->email = $value;
}
}
public string $firstName {
set => trim($value) ?: throw new InvalidArgumentException('First name cannot be empty');
}
public string $lastName {
set => trim($value) ?: throw new InvalidArgumentException('Last name cannot be empty');
}
public string $fullName {
get => $this->firstName . ' ' . $this->lastName;
}
}Here’s the cool part:
$fullName is a virtual property. It doesn't actually store data — it's computed on-the-fly from firstName and lastName. No wasted memory, no sync issues.I could keep going, but others have already explored this better than I could. For the full deep-dive — asymmetric visibility, edge cases & advanced usage — check out these two excellent articles: Property Hooks in PHP 8.4: Game Changer or Hidden Trap? & PHP 8.4 Property Hooks: The Game-Changer You’ve Been Waiting For.
🆕 new without Parentheses — Goodbye Brackets
PHP 8.4 brings another small-but-mighty improvement: you don’t have to wrap
new invocations in parentheses anymore to chain methods.Instead of this gymnastics:
$name = (new MyClass())->myMethod();You can now simply write:
$name = new MyClass()->myMethod();This might seem like a small change, but small improvements to developer experience compound over time. Your future self will thank you.
🏁 The #[Deprecated] Attribute — Finally, Native Support
Remember the good old
/** @deprecated */ docblock? Sure, PHPStorm understood it, and static analysers like PHPStan could catch it — but PHP itself? It couldn't care less. You were basically leaving a polite note that the language completely ignored.Well, not anymore. PHP 8.4 introduces a native
#[Deprecated] attribute that the engine actually respects. And the cherry on top? It enforces metadata to explain what to use instead and since when it's deprecated:#[Deprecated(
message: "use writeArticleOnTime() instead",
since: "kevin/procrastination:13.0"
)]
function writeArticleAboutPHP84(): void
{
// I'll do it next week, I promise
}PHP 8.4 might be old news by now, but these features are here to stay. Property hooks, cleaner instantiation, native deprecations — small wins that make daily coding just a bit more enjoyable.
Now if you’ll excuse me, I have a PHP 8.5 article to procrastinate on.
❤️ Love on your keyboards.
Sources
stitcher.io (Nov 2024) What’s new in PHP 8.4.
https://stitcher.io/blog/new-in-php-84
https://stitcher.io/blog/new-in-php-84
David Grudl (Nov 2024). Property Hooks in PHP 8.4: Game Changer or Hidden Trap?
https://phpfashion.com/en/property-hooks-in-php-8-4
https://phpfashion.com/en/property-hooks-in-php-8-4
Matthias Breddin (Nov 2025). PHP 8.4 Property Hooks: The Game-Changer You’ve Been Waiting For.
https://fsck.sh/en/blog/php-84-property-hooks-guide
https://fsck.sh/en/blog/php-84-property-hooks-guide
PHP RFC (Dec 2022) Property hooks.
https://wiki.php.net/rfc/property-hooks
https://wiki.php.net/rfc/property-hooks
PHP RFC (Dec 2023) new MyClass()->method() without parentheses.
https://wiki.php.net/rfc/new_without_parentheses
https://wiki.php.net/rfc/new_without_parentheses
PHP RFC (May 2024) #[\Deprecated] Attribute.
https://wiki.php.net/rfc/deprecated_attribute
https://wiki.php.net/rfc/deprecated_attribute
Resources
Claude AI, https://claude.ai
Helped with writing and text refinement.
Helped with writing and text refinement.
Nano Banana, https://gemini.google/overview/image-generation
Generated the very accurate article’s cover illustration.
Generated the very accurate article’s cover illustration.
More articles
Author(s)
Making of : “La nuit des Losers”
lanuitdeslosers.ch, built fast: paper wireframes, a bold hand-drawn identity, then Claude Code to prototype and ship. A mouse-tracking hero animation, a bowling game made of sponsor logos, and a few bugs we’re keeping.
Author(s)
Dark mode: necessity or trend
Nous faisons le tri entre idées reçues, réalités techniques et bonnes pratiques de design.
Experiment #2 – Surway, a social experiments game
Pour notre deuxième expérimentation, nous avons relevé le défi de sortir de notre zone de confort en développant Surway, un jeu vidéo jouable directement dans le navigateur, où les actions de chaque joueur restent inscrites pour tous ceux qui suivront.













