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

Reply via email to