[wp-trac] [WordPress Trac] #43583: Introduce new PHP cross-version compat function `is_countable()`

WordPress Trac noreply at wordpress.org
Tue Mar 20 12:45:38 UTC 2018


#43583: Introduce new PHP cross-version compat function `is_countable()`
-------------------------+-----------------------------
 Reporter:  jrf          |      Owner:
     Type:  enhancement  |     Status:  new
 Priority:  normal       |  Milestone:  Awaiting Review
Component:  General      |    Version:  trunk
 Severity:  normal       |   Keywords:
  Focuses:               |
-------------------------+-----------------------------
 PHP 7.2 introduced a warning when `count()` is used on something non-
 countable.

 PHP 7.3 will introduce a new function called `is_countable()` which will
 basically check:
 {{{#!php
 if (is_array($foo) || $foo instanceof Countable) {
     // $foo is countable
 }
 }}}
 See: https://wiki.php.net/rfc/is-countable
 Note: the RFC has passed the vote and the function has already been
 implemented and merged into PHP Core.

 I would like to suggest adding this new function to the `wp-
 includes/compat.php` file, like so:
 {{{#!php
 if ( ! function_exists( 'is_countable' ) ) :
         function is_countable( $var ) {
                 return ( is_array( $var ) || $var instanceof Countable );
         }
 }
 endif;
 }}}

 This seems like low hanging fruit. Both the
 [http://php.net/manual/en/language.operators.type.php `instanceof`
 operator] as well as the [http://php.net/manual/class.countable.php
 `Countable` interface] were already available in PHP 5.2.4, so there
 should be no cross-version compatibility issues with introducing this
 function.

 The function would provide an easy helper function to help fix the various
 issues where the warning is currently being reported - both for Core as
 well as for plugin/theme devs -.


 Existing code like this:
 {{{#!php
 if ( count( $var ) > 0 ) {
         // Do something.
 }
 }}}

 can then be replaced by:
 {{{#!php
 if ( is_countable( $var ) && count( $var ) > 0 ) {
         // Do something.
 }
 }}}


 This would prevent new bugs from being introduced by people "fixing" these
 issues using an extra check with `empty()` which I've seen being suggested
 a couple of times now and which really is not a good idea as `empty()`
 will also return `false` when a non-zero integer, a boolean `true` or a
 non-zero string is passed. All of which would still result in the PHP 7.2
 warning being thrown.

 The function would also still allow for code refactoring from arrays to
 objects. /cc @schlessera


 I would suggest introducing this function ASAP and not to wait for a major
 release.


 Related issues (there are probably more, but a quick search yielded
 these):
 #43374, #43368, #43312, #43216, #43201, #43216, #43201, #42860, #42814,
 #42147, #42498

--
Ticket URL: <https://core.trac.wordpress.org/ticket/43583>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list