# RFC: Property hook improvements

- Status: Implemented (PHP 8.4)
- Authors: Ilija Tovilo (tovilo.ilija@gmail.com), Larry Garfield (larry@garfieldtech.com)
- Date: 2024-06-28
- Version: 0.9
- Original: https://wiki.php.net/rfc/hook_improvements
- Page: https://externals.io/rfc/hook_improvements
- More for agents: search with https://externals.io/search.md?q={query} · RFCs at https://externals.io/rfc.md · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

## Votes

### Remove the extra hook recursion guard? (closed)

Yes: 33 · No: 0

Voters: alcaeus (Yes), beberlei (Yes), bwoebi (Yes), crell (Yes), derick (Yes), devnexen (Yes), ericmann (Yes), galvao (Yes), girgias (Yes), ilutov (Yes), jhdxr (Yes), jimw (Yes), josh (Yes), kalle (Yes), kguest (Yes), kocsismate (Yes), lbarnaud (Yes), mauricio (Yes), mbeccati (Yes), nicolasgrekas (Yes), nielsdos (Yes), patrickallaert (Yes), petk (Yes), pierrick (Yes), ramsey (Yes), rasmus (Yes), reywob (Yes), sebastian (Yes), sergey (Yes), theodorejb (Yes), timwolla (Yes), trowski (Yes), weierophinney (Yes)

## Discussions on the mailing list

- [\[RFC\] Property Hook improvements](https://externals.io/message/124149.md) — started on 2024-07-01, 17 messages
- [\[Vote\] Property Hook performance improvements](https://externals.io/message/124433.md) — started on 2024-07-15, 2 messages

---

## Introduction

While finalizing the implementation of the [property hooks RFC](https://externals.io/rfc/property-hooks) patch, we have found a small area for improvement. This is nominally changes from the behavior defined in the original RFC, and thus we want to refer them through the RFC process.

## Proposal

There is one improvement we propose.

As defined in the original RFC, the following code would have been detected and throw a dedicated error.

```php
class C
{
    public string $val = 'a' {
        get {
          return $this->val . $this->suffix();
        }
    }
 
    public function suffix(): string
    {
        return $this->val;
    }
}
 
$c = new C();
print $c->val;
```

While looking for optimizations, Ilija found he was able to refactor the hook logic to make it more than twice as fast: While there is still some overhead to a hook compared to a traditional get method, it's been reduced from “close to the cost of `__get`” to “almost negligible compared to a method.” Enough that it would almost certainly be swamped by the cost of the hook body itself. This is a massive improvement.

A side effect of that optimization, however, is that we cannot proactively detect the bug above. Instead, it would result in an infinite loop, which would eventually trigger a stack limit exception from PHP. (That logic already exists.)

We consider the slightly worse error handling fully justified by the performance improvement, and by the fact that the code above is a bug no matter what (it's just a question of when the bug gets reported). But as it is a change from the behavior stated in the previous RFC, we are putting it out for consideration.

## Backward Incompatible Changes

None.

## Proposed PHP Version(s)

PHP 8.4.

## RFC Impact

## Proposed Voting Choices

**Vote: Remove the extra hook recursion guard?** — Yes: 33 · No: 0 (closed)

## Patches and Tests

## Implementation

After the project is implemented, this section should contain

1. the version(s) it was merged into
2. a link to the git commit(s)
3. a link to the PHP manual entry for the feature
4. a link to the language specification section (if any)

## References

Links to external references, discussions or RFCs

## Rejected Features

Keep this updated with features that were discussed on the mail lists.
