Pecl proposal: weakreference_bc: Polyfilling WeakReference/WeakMap classes in php 7.1-7.4

[email protected] (tyson andre) Sat, 4 Dec 2021 23:13:00 +0000
Newsgroups php.pecl.dev
Message-ID <DM6PR14MB4155E24A5E8D60F2ADB1B522F96B9@DM6PR14MB4155.namprd14.prod.outlook.com>
Hi,

I'd started work on https://github.com/TysonAndre/pecl-weakreference_bc - it's nearly finished, and I'd like to add it as a PECL.

- This is a fork of the https://pecl.php.net/package/weakref pecl (using the WeakReference::create API instead of `new WeakRef`), which was abandoned in 2016 because the project maintainers believed php 7.3 support was impractical. (standard object handler arrays became constant, but I worked around that. I didn't see discussion of specifics of compatibility issues on the issue tracker..)

  I believe the issues were fixed in this fork - many tests of php-src's WeakReference/WeakMap are now passing (or behaving slightly differently without crashing) in the PECL, and I can use simple scripts with php's development server (`php -S`) to test MINIT + repeated RINIT+RSHUTDOWN.
- This omits WeakReference in 7.4 because it's already declared.
- This aims to match the API of WeakReference exactly (removes acquire(), release(), valid(), dynamic property support, etc) - many end users would not want to support multiple different APIs.

https://wiki.php.net/rfc/deprecate_dynamic_properties recently passed, recommending using WeakMap for use cases
where extra information needs to be associated with an object instance that isn't owned.

> Instead, a WeakMap should be used to store the information in a non-intrusive way:

However, WeakMap is new in PHP 8.0, meaning that libraries using that approach would have to drop support for php 7,
or use a polyfill that doesn't free unused object keys, potentially leaking memory.
So having a PECL providing a native polyfill would be useful when upgrading older installations to php 8.2+.

Thoughts?

Thanks,
Tyson