Hello, list!
I’d like to do a little temperature check on the behaviour of `isset`.
Currently `isset($maybeObject->optionalKey)` returns `true` or `false`
without any warnings if
1. `$maybeObject->optionalKey` is `193`
2. `$maybeObject->optionalKey` is `null`
3. `$maybeObject` is an object that doesn’t have the `optionalKey` field
4. `$maybeObject` is `null`
5. `$maybeObject` is undefined
6. `$maybeObject` is a string, array, whatevā…
In my understanding a key idea in the design of `isset` was that it is there
so you could check whether the whole `$result->athlete->name` will produce
something showable instead of having to step by step verify `isset($result,
$result->athlete, $result->athlete->name)`. And it does the same for arrays
supporting arbitrary level of key depth.
This fails inside array access, i.e. `$array[$maybeObject->optionalKey]`.
Now the cases from above work as follows
1. `$maybeObject->optionalKey` is `193`
returns `true` or `false` and that’s it
2. `$maybeObject->optionalKey` is `null`
DEPRECATED Using null as an array offset is deprecated, use an empty string
instead.
3. `$maybeObject` is an object that doesn’t have the `optionalKey` field
WARNING Undefined property: stdClass::$optionalKey.
DEPRECATED Using null as an array offset is deprecated, use an empty string
instead.
4. `$maybeObject` is `null`
WARNING Attempt to read property "optionalKey" on null.
DEPRECATED Using null as an array offset is deprecated, use an empty string
instead.
5. `$maybeObject` is undefined
WARNING Undefined variable $maybeObject.
WARNING Attempt to read property "optionalKey" on null.
DEPRECATED Using null as an array offset is deprecated, use an empty string
instead.
6. `$maybeObject` is a string, array, whatevā…
WARNING Attempt to read property "b" on array.
DEPRECATED Using null as an array offset is deprecated, use an empty string
instead.
It’s also a bit inconsistent in that the DEPRECATED warning goes away if
`$array` itself is undefined or a bool/number/string. Or gets replaced with
an error if `$array` is an object.
To me it looks like `isset` is not doing its job. I’d expect
`isset($array[$maybeObject->optionalKey])`to return without complaints and I
expect the `??` to not complain either if the verifiable contents was empty.
When I’m putting stuff into an array, it’s significant the `$array[null]`
and `$array['']` override each other. When I’m extracting contents the info
that `$array[$someKey]` is empty is enough. The cast might matter if the
result is non-empty, but I don’t care that the impossible `null` key got
casted to an undefined `''` one. Having to check `$someKey` separately seems
to betray the idea of `isset`.
I would like to propose warnings/deprecations from array access inside an
`isset`. To make the stuff inside square brackets behave just as silently as
if it was wrapped in an `isset` itself.
What do you think?
BR,
Juris