Craig Duncan

Craig Duncan

Contents

PHP RFC: Counting of non-countable objects

Introduction

Calling count() on a scalar or object that doesn't implement the Countable interface (http://php.net/manual/en/class.countable.php) returns 1. There are no known use cases for this, and it can easily hide bugs, take the following example:

function handle_records(iterable $iterable)
{
    if (count($iterable) === 0) {
        return handle_empty();
    }
 
    foreach ($iterable as $value) {
        handle_value($value);
    }
}

Passing a Generator that yields nothing would not call handle_empty(), or handle_value(), or alert the developer to the issue.

Proposal

This RFC proposes adding a warning when calling count() with a parameter that is a scalar, null, or an object that doesn't implement Countable.

Note that the sizeof alias is also affected. http://php.net/manual/en/function.sizeof.php

Backward Incompatible Changes

The call to count() will still return 1 (or 0 for null) so backwards compatibility is maintained.

Environments that display warnings or convert them to more severe errors/exceptions would be affected, but this should just bring attention to a bug in the code.

Proposed PHP Version(s)

PHP 7.2

Proposed Voting Choices

Simple Yes/No vote that doesn't change the language itself so requires 50% + 1 votes to get 'accepted'.

Implementation

Pull request to handle the change: https://github.com/php/php-src/pull/2185

References

Initial discussion that led to this RFC's creation: https://github.com/php/php-src/pull/1672

Discussion thread: http://externals.io/thread/350

Voting thread: http://externals.io/thread/409

Votes

An option needs 50%+1 votes to win

Counting of non-countable objects (100% approved)
User Vote
ajf Yes
alan_k Yes
bishop Yes
bwoebi Yes
cmb Yes
colinodell Yes
danack Yes
davey Yes
galvao Yes
guilhermeblanco Yes
hywan Yes
jhdxr Yes
kguest Yes
lcobucci Yes
leigh Yes
marcio Yes
mariano Yes
mbeccati Yes
mfonda Yes
mike Yes
nikic Yes
ocramius Yes
omars Yes
pierrick Yes
rasmus Yes
sammyk Yes
santiagolizardo Yes
tpunt Yes
trowski Yes
yohgaki Yes
zimt Yes