====== 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 (( https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/template.php#L2007 )):
if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) )
OpenCart (( https://github.com/opencart/opencart/blob/45fc863fa068d82b5280890e6466a198faa54bff/upload/admin/controller/openbay/ebay_profile.php#L128 )):
if (empty($setting['dispatch_times']) || empty($setting['countries']) || empty($setting['returns'])){
phpBB (( https://github.com/phpbb/phpbb/blob/040d451dcca9ae54d8f4b7bdd2f231033765a8f2/phpBB/phpbb/notification/method/jabber.php#L48 )):
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 [[http://en.wikipedia.org/wiki/Principle_of_least_astonishment|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.
* Yes
* No
Voting starts on 2015-03-07 and ends on 2015-03-21.
===== Patches and Tests =====
PR: https://github.com/php/php-src/pull/1109