On Mon, May 8, 2023, at 9:38 PM, Larry Garfield wrote: > Ilija Tovilo and I would like to offer another RFC for your > consideration. It's been a while in coming, and we've evolved the > design quite a bit just in the last week so if you saw an earlier draft > of it in the past few months, I would encourage you to read it over > again to make sure we're all on the same page. I'm actually pretty > happy with where it ended up, even if it's not the original design. > This approach eliminates several hard-to-implement edge cases while > still providing a lot of functionality in one package. > > https://wiki.php.net/rfc/property-hooks
Hi folks. Based on feedback we've made a few smaller changes to the RFC. Changelog: * The sections describing isset/unset and magic methods have been rewritten to be clearer. Nothing changed in the actual behavior, it is now just explained better. * Contravariance on the "set" type is now enforced. Ilija figured out how to make it work. :-) That means a non-contravariant type on the set hook will now throw an error, as expected. * After extensive discussion with Nicolas Grekas, we've decided to allow references in a very narrow case. Specifically, on a *virtual property* (one that has no inherent backing store), you may implement a `&get` hook instead of `get`, and the value it returns will be returned by reference, and may be captured using $foo =& $bar->baz; We determined that it is a bit better for BC (in the rare cases that you actually want to get a reference to a property, you can, even if it requires a little more work), doesn't break anything else, and is consistent with the way `&__get` behaves. __get/__set are basically "anonymous virtual properties", so now they behave the same way. By the same token, setting by reference is still not allowed, which is also true for __set today. As there was no other interest in it stated, we're going to hold off on an `unset` hook at this time. Given the earlier discussion I think there is a valid use case for it, so it would be a worthwhile follow up RFC in the future, but for the moment we want to keep it simple. There also doesn't seem to be much interest in specifying which hook gets the double-shortened syntax. I can see the argument for it, but it would increase the typing in a common case for an unclear benefit, and only one person expressed any interest in it. So we're not going to go that route. There's two items still pending. 1. Ilija is experimenting with the `parent::$prop::get()` syntax, to see if either the syntax or implementation can be simplified. There may or may not be a small change here as a result, TBD. 2. Ilija still has to verify that foreach() can work with virtual properties as the RFC currently describes. The implementation details are thornier than they seem, so that still needs some validation and testing. Assuming both of those get sorted out soon, we will probably call a vote around the end of the month, give or take. Cheers. --Larry Garfield -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php