Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
rfc:variadic_empty [2015/02/21 04:51] – tpunt | rfc:variadic_empty [2015/03/26 08:55] – tpunt |
---|
* Date: 2015-02-20 | * Date: 2015-02-20 |
* Author: Thomas Punt, tpunt@hotmail.co.uk | * Author: Thomas Punt, tpunt@hotmail.co.uk |
* Status: Under Discussion | * Status: Closed |
* First Published at: http://wiki.php.net/rfc/variadic_empty | * First Published at: http://wiki.php.net/rfc/variadic_empty |
| |
===== Introduction ===== | ===== Introduction ===== |
This RFC aims to enable ''empty()'' to accept any number of arguments. | This RFC aims make ''empty()'' have a variable arity. |
| |
<code php> | <code php> |
| |
===== Proposal ===== | ===== Proposal ===== |
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. | 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 - 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. | 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 ===== | ===== 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: | 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#L1963 )) | WordPress (( https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/template.php#L2007 )): |
<code php> | <code php> |
if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) ) | if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) ) |
</code> | </code> |
* OpenCart (( https://github.com/opencart/opencart/blob/45fc863fa068d82b5280890e6466a198faa54bff/upload/admin/controller/openbay/ebay_profile.php#L128 )) | OpenCart (( https://github.com/opencart/opencart/blob/45fc863fa068d82b5280890e6466a198faa54bff/upload/admin/controller/openbay/ebay_profile.php#L128 )): |
<code php> | <code php> |
if (empty($setting['dispatch_times']) || empty($setting['countries']) || empty($setting['returns'])){ | if (empty($setting['dispatch_times']) || empty($setting['countries']) || empty($setting['returns'])){ |
</code> | </code> |
* phpBB (( https://github.com/phpbb/phpbb/blob/040d451dcca9ae54d8f4b7bdd2f231033765a8f2/phpBB/phpbb/notification/method/jabber.php#L48 )) | phpBB (( https://github.com/phpbb/phpbb/blob/040d451dcca9ae54d8f4b7bdd2f231033765a8f2/phpBB/phpbb/notification/method/jabber.php#L48 )): |
<code php> | <code php> |
return !( | return !( |
empty($this->config['jab_enable']) || | empty($this->config['jab_enable']) || |
empty($this->config['jab_host']) || | empty($this->config['jab_host']) || |
empty($this->config['jab_username']) || | empty($this->config['jab_username']) || |
empty($this->config['jab_password']) || | empty($this->config['jab_password']) || |
!@extension_loaded('xml') | !@extension_loaded('xml') |
); | ); |
</code> | </code> |
* 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 [[http://en.wikipedia.org/wiki/Principle_of_least_astonishment|Principle of Least Astonishment]] (mainly aimed at neophyte developers). | 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 ===== | ===== Backward Incompatible Changes ===== |
The current functionality of ''empty()'' will be completely preserved. | The current functionality of ''empty()'' will be completely preserved. |
| |
===== Proposed Voting Choices ===== | ===== Vote ===== |
State whether this project requires a 2/3 or 50%+1 majority (see [[voting]]) | 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. |
| |
| <doodle title="Make empty() a Variadic" auth="tpunt" voteType="single" closed="true"> |
| * Yes |
| * No |
| </doodle> |
| |
| Voting starts on 2015-03-07 and ends on 2015-03-21. |
| |
===== Patches and Tests ===== | ===== Patches and Tests ===== |
| |
PR: https://github.com/php/php-src/pull/1109 | PR: https://github.com/php/php-src/pull/1109 |