Re: Consensus gathering: allowing unsetting of backed property hooks
| From: | Rowan Tommins [IMSoP] | Date: | Tue, 25 Feb 2025 22:51:40 +0000 |
| Subject: | Re: Consensus gathering: allowing unsetting of backed property hooks | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-126506@lists.php.net to get a copy of this message | ||
On 25/02/2025 21:13, tight.fork3192@fastmail.com wrote:
Hello! I started GitHub issue requesting that property hooks be allowed to be unset():https://github.com/php/php-src/issues/17922
While discussing in the issue it was suggested I pitch this to the mailing list, so here I am.
Place me firmly in the "unset() is already weird enough" camp.
I actually started writing an RFC to rationalise some of this behaviour, but gave up because it's such a mess.
Here are some of the things that might happen as a result of unset($foo->bar):
* Nothing at all, because unsetting a non-existent property isn't even a Warning
* A dynamic property (not declared, but created because it was assigned a value) is deleted without trace
* A property declared with no type becomes "undefined", and appears to be deleted (e.g. disappears from var_dump) ...
* ... but retains its visibility (e.g. you'll still get an error writing to it from outside the class if it's private)
* A property declared *with* a type (even if that type is "mixed") instead becomes "uninitialized" - it still appears in var_dump, and accessing it is an Error, instead of a Warning
* An __unset() handler might be called ...
* ... even if the property is declared, but is currently "undefined" or "uninitialized" ...
* ... and that handler could do absolutely anything, including throwing an exception
If we allow a hooked property to directly "unset" the backing value, what *exactly* will it do? And what if it's a virtual property, so there is nothing to unset? If we add an "unset" hook, what's the default behaviour if one isn't defined?
I think it's one of those features that sounds simple when you look at a single use case, but actually specify the behaviour in all cases is going to be a lot of work.
--
Rowan Tommins
[IMSoP]