This is an old revision of the document!

PHP RFC: Make empty() a Variadic


This RFC aims to enable empty() to accept any number of arguments.

// 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 has a variable arity. 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 - otherwise, false is returned. This behaviour seems to be the most prevalent usage of multiple empty checks in a condition, therefore benefitting the most end users.


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 variables. Also, it will make empty() more inline with the not-too-disimillar isset(), which is good for the Principle of Least Astonishment (mainly aimed at neophyte developers).

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.

Proposed Voting Choices

State whether this project requires a 2/3 or 50%+1 majority (see voting)

Patches and Tests

rfc/variadic_empty.1424494063.txt.gz · Last modified: 2017/09/22 13:28 (external edit)