PHP Conference Japan 2024

The Countable interface

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Introduzione

Classes implementing Countable can be used with the count() function.

Sommario dell'interfaccia

interface Countable {
/* Metodi */
public count(): int
}

Indice dei contenuti

add a note

User Contributed Notes 3 notes

up
45
isaac dot z dot foster dot nada at spamporfav dot gmail dot com
14 years ago
I just want to point out that your class has to actually implement the Countable interface, not just define a count method, to be able to use count($object) and get the expected results. I.e. the first example below won't work as expected, the second will. (The normal arrow function accessor ($object->count()) will work fine, but that's not the kewl part :) )

<?php
//Example One, BAD :(

class CountMe
{

protected
$_myCount = 3;

public function
count()
{
return
$this->_myCount;
}

}

$countable = new CountMe();
echo
count($countable); //result is "1", not as expected

//Example Two, GOOD :)

class CountMe implements Countable
{

protected
$_myCount = 3;

public function
count()
{
return
$this->_myCount;
}

}

$countable = new CountMe();
echo
count($countable); //result is "3" as expected
?>
up
3
adam at adamhahn dot com
7 years ago
When using GMP/BC/Floating-Point Numbers to work with integers larger than PHP_INT_MAX, be aware that using the count() function will typecast the returned value to an integer.

<?php
class counter implements Countable {
public function
count() {
// Number of IPv6 addresses in a single /32 IPv6 allocation (2^96)
return "18446744073709551616"; // assume generated/exported by big-int library(GMP/BC/etc.)
}
}

$obj = new counter();

echo
$obj->count(); // prints string "18446744073709551616"
echo count($obj); // prints int PHP_INT_MAX

// This is because of the typecasting
echo (int) "18446744073709551616"; // prints int PHP_INT_MAX
?>

This will also cause problems for floating-point values.

<?php
class counter implements Countable {
public function
count() {
// Number of IPv6 addresses in a single /32 IPv6 allocation (2^96)
return 18446744073709551616;
}
}

$obj = new counter();

echo
$obj->count(); // prints float 18446744073709551616.000000
echo count($obj); // prints int 0

// This is because of the typecasting
echo (int) 18446744073709551616; // prints int 0
?>

This is only problematic when counting higher than PHP_INT_MAX.
up
1
Anonymous
13 years ago
Note that arrays don't implement countable. Therefore you can't force a countable parameter for a function if you want it also to work with native arrays.
To Top