Thomas Punt


PHP RFC: Make empty() a Variadic


This RFC aims make empty() have a variable arity.

// example current usage #1:
if (empty($a) || empty($b) || empty($c)) {}
// example current usage #2:
if (!empty($a) && !empty($b) && !empty($c)) {}
// new proposed usage #1:
if (empty($a, $b, $c)) {}
// new proposed usage #2:
if (!empty($a, $b, $c)) {}


The proposal is to change empty() so that it can accept multiple arguments. This will enable developers to write more compact code when checking for the emptiness of multiple expressions.

As the above snippet demonstrates, the semantics of a variadic empty() should be the equivalent to logically OR'ing together multiple empty() invocations. Thus, if any arguments passed into empty() are considered falsy, then true will be returned; if no arguments are considered empty, then false is returned. This behaviour is the most logical (given empty()'s falsy semantics) and seems to be the most prevalent usage of multiple empty checks in user-land code (therefore being the most beneficial behaviour).


In PHP, it is not uncommon to see conditionals consisting of multiple empty() invocations. This is evident by simply browsing through some popular open source projects:

WordPress 1):

if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) )

OpenCart 2):

if (empty($setting['dispatch_times']) || empty($setting['countries']) || empty($setting['returns'])){

phpBB 3):

return !(
	empty($this->config['jab_enable']) ||
	empty($this->config['jab_host']) ||
	empty($this->config['jab_username']) ||
	empty($this->config['jab_password']) ||

And so on…

So this seems like quite a common need for users, and one that cannot be emulated in user-land code because of empty()'s behaviour of suppressing undefined variable errors.

This change will also make empty() more inline with the not-too-dissimilar isset(), which is good for POLA.

Backward Incompatible Changes

No BC breakages.

Proposed PHP Version(s)

PHP 7.0

Unaffected PHP Functionality

The current functionality of empty() will be completely preserved.

Patches and Tests


An option needs 2/3 votes to win

Make empty() a Variadic (50% approved)
User Vote
aharvey Yes
ajf Yes
auroraeosrose No
bishop Yes
brandon Yes
bwoebi Yes
crodas Yes
Damien Tournoud Yes
danack No
derick No
diegopires Yes
dmitry No
dragoonis Yes
duodraco Yes
eliw No
fredemmott No
frozenfire Yes
galvao Yes
gasolwu Yes
guilhermeblanco Yes
gwynne Yes
ircmaxell No
jedibc No
jgmdev Yes
jmikola No
kguest Yes
kinncj No
krakjoe No
lcobucci No
leigh No
mbeccati No
mfischer No
mfonda Yes
mike Yes
ocramius No
pajoye Yes
pauloelr Yes
peehaa No
philstu No
pollita No
ramsey No
rdohms No
rmf Yes
salathe No
santiagolizardo Yes
sebastian No
stas Yes
stelianm No
svpernova09 No
yohgaki Yes
yunosh Yes
zeev No