This RFC proposes to allow arbitrary expressions as arguments to empty()
and isset()
.
Currently empty()
and isset()
only accept variables as arguments. Thus it is possible to write empty($foo)
,
but it is not possible to write empty(foo())
.
Trying to do so results in this not particularly helpful error message: “Can't use function return value in write context”.
For other expressions (not variables and not function calls) a parse error is thrown.
Using empty()
and isset()
on a non-variable was disallowed previously, as the main purpose of these language
constructs is to suppress an error message in case the passed variable does not exist.
As for function calls (and other expressions) it is already known that the value exists, using empty()
/isset()
is
not necessary and !func()
/func() !== null
can be used instead.
Even though !func()
and empty(func())
would behave exactly the same, the latter is more readable in certain contexts.
For example if func()
is expected to return an array, it feels more natural to verify it's emptiness using empty()
instead
of !
.
Furthermore the current behavior often is unexpected to newbies. empty()
and isset()
look like functions, so programmers
new to PHP expect them to accept any value (in particular function call results).
The patch is available as a PR on Github: https://github.com/php/php-src/pull/54
After further discussion it seems like it might be better to only add expression support for empty()
, but not for isset()
. The
original RFC included isset()
, because changing only one of the language constructs seemed inconsistent (as they are so similar).
On the other hand, using isset()
on function calls and other expressions doesn't seem particularly useful. isset(someFunction())
is semantically unclear (how can someFunction()
not be set?) and could be interpreted as a check whether the function itself exists.
Allowing isset()
to accept expressions would probably only cause confusion.
The previous vote is obsolete and is left here only for reference:
The RFC was accepted with the option “Only empty()”. The relevant commit it https://github.com/php/php-src/commit/ec061a93c53c8cde10237741e98e992c1a05d148.