PHP 8.4: Property Hooks

PHP 8.4: Property Hooks

PHP 8.4 is expected for this fall. Let’s review the RFC “Property Hooks.”

What are PHP RFCs?

RFC means “Request For Comments.” It’s a pretty old concept (probably older than Internet itself) many core teams and their community use to discuss and implement new features, deprecate obsolete code or enhance existing structures.

The process for PHP is pretty well-documented, so do not hesitate to read this page if you want more details.

Here we’ll focus on a specific RFC that looks promising: Property Hooks.

Other notable RFCs

While we’ll focus on Property Hooks, there are other RFCs you might want to read:

Deprecate implicitly nullable parameter types
new MyClass()->method() without parentheses
Increasing the default BCrypt cost
Raising zero to the power of negative number
DOM HTML5 parsing and serialization
Multibyte for ucfirst and lcfirst functions
Multibyte for trim function mb_trim, mb_ltrim and mb_rtrim

Where to find all accepted RFCs?

You can check this page.

Property hooks in short

This RFC aims to remove the hassle of using boilerplate (e.g., getters/setters) for common interaction with object’s properties.

PHP 8.0 already allows promoting properties in the constructor, so it’s far less verbose than it used to be:

class User
{
public function __construct(public string $name) {}
}

However, the RFC underlines the fact there’s no built-in way to add custom behaviors or validation to these properties, which ultimately brings developers back to clumsy and verbose solutions (boilerplate or magic getters/setters).

With property hooks, this could be built-in the language:

interface Named
{
public string $fullName { get; } // make the hook required
}

class User implements Named
{
public function __construct(private string $firstName, private string $lastName) {}

public string $fullName {
get => strtoupper($this->firstName) . ” “ . strtoupper($this->lastName);
}
}

What’s the problem with getters and setters?

You may read this [old] introduction:

👉🏻 When used blindly, setters and getters can break encapsulation, as the idea is to prevent anybody from modifying the object from the outside, and you probably want to keep the implementation private.

Wrap up

PHP contributors seem more and more inspired by other languages (e.g. Kotlin).

The RFC only includes two hooks: set and get, but there could be more hooks in the future.