PHP RFC: Make empty() a Variadic
- Version: 0.1
- Date: 2015-02-20
- Author: Thomas Punt, tpunt@hotmail.co.uk
- Status: Declined
- First Published at: http://wiki.php.net/rfc/variadic_empty
Introduction
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)) {}
Proposal
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).
Justification
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']) || !@extension_loaded('xml') );
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.
Vote
Because this is a language change, a 2/3 majority is required. It is a simple yes/no vote on whether empty()
should be made a variadic.
Voting starts on 2015-03-07 and ends on 2015-03-21.