[PHP-DEV] Preventing `isset` from complaining about stuff inside square brackets not being set

[email protected] ("Juris Evertovskis")
Newsgroups php.internals
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.