Re: In php 8.0: unable to distinguish between instance variable being null and unset
| From: | Alexandru Pătrănescu | Date: | Sat, 04 Sep 2021 20:26:27 +0000 |
| Subject: | Re: In php 8.0: unable to distinguish between instance variable being null and unset | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-327652@lists.php.net to get a copy of this message | ||
Hey Emiel,
On Fri, Sep 3, 2021 at 3:09 PM Emiel Mols <emiel@crisp.nl> wrote:
> Hello,
>
> Our codebase depends on distinguishing whether an instance variable is
> unset, or simply null:
>
Can you please share more on how you use this information? Is it for lazy
loading something that might not be loadable in the end?
>
> class C { public int $v = 123; }
> $x = new C; unset($x->v);
> $y = new C; $u->v = null;
>
> In php <8.0 we made this work with @array_key_exists($x, 'v'), which
> stopped working. isset($x->x) doesn't work, as it will return true for
> 'null' as well. property_exists($x, 'v') will always return true as long as
> the variable is declared: php-src here
>
> <https://github.com/php/php-src/blob/a13730c5e465b3c349a7970d15a49e4e132d4e07/Zend/zend_builtin_functions.c#L943>
> .
>
> Apart from using debug_zval_dump (too expensive), any hints?
>
I think the simplest solution would be to cast the object to an array and
you will see that the unset property will not be a key in the array while
the null one will be.
Another way to go here would be to use the magic method __get() that would
be called on the unset property. But not sure how that fits with your use
case.
Also something like this could work: https://3v4l.org/7NL0Y,
trying to read
the property and handling the Error thrown.
But it all depends on how you use this... Please share more to help you
correctly.
> This feels like quite the oversight honestly :).
>
This feels like quite a special use case that could be implemented
differently to start with. Please share more information so we can help
better.
I guess you have read the rfc that deprecated this in 7.4 and scheduled for
later removal:
https://wiki.php.net/rfc/deprecations_php_7_4#array_key_exists_with_objects
>
> Best,
>
> Emiel
>
Alex