可计数接口

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

简介

实现 Countable 的类可以使用 count() 函数。

接口概要

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

目录

添加注释

用户贡献的注释 3 个注释

45
isaac dot z dot foster dot nada at spamporfav dot gmail dot com
14 年前
我只想指出,你的类必须实际实现 Countable 接口,而不仅仅是定义一个 count 方法,才能使用 count($object) 并获得预期结果。例如,下面的第一个示例将无法按预期工作,而第二个将按预期工作。(正常的箭头函数访问器($object->count())将正常工作,但这不是关键点 :))

<?php
// 示例一,错误 :(

class CountMe
{

protected
$_myCount = 3;

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

}

$countable = new CountMe();
echo
count($countable); // 结果为 "1",并非预期结果

// 示例二,正确 :)

class CountMe implements Countable
{

protected
$_myCount = 3;

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

}

$countable = new CountMe();
echo
count($countable); // 结果为 "3",符合预期
?>
3
adam at adamhahn dot com
7 年前
当使用 GMP/BC/浮点数来处理大于 PHP_INT_MAX 的整数时,请注意使用 count() 函数会将返回的值类型转换为整数。

<?php
class counter implements Countable {
public function
count() {
// 单个 /32 IPv6 分配中的 IPv6 地址数量(2^96)
return "18446744073709551616"; // 假设由大整数库(GMP/BC 等)生成/导出
}
}

$obj = new counter();

echo
$obj->count(); // 打印字符串 "18446744073709551616"
echo count($obj); // 打印整数 PHP_INT_MAX

// 这是由于类型转换导致的
echo (int) "18446744073709551616"; // 打印整数 PHP_INT_MAX
?>

这也会导致浮点数出现问题。

<?php
class counter implements Countable {
public function
count() {
// 单个 /32 IPv6 分配中的 IPv6 地址数量(2^96)
return 18446744073709551616;
}
}

$obj = new counter();

echo
$obj->count(); // 打印浮点数 18446744073709551616.000000
echo count($obj); // 打印整数 0

// 这是由于类型转换导致的
echo (int) 18446744073709551616; // 打印整数 0
?>

只有在计数超过 PHP_INT_MAX 时才会出现这个问题。
1
匿名
13 年前
请注意,数组没有实现可计数。因此,如果你想要让函数也适用于原生数组,那么你不能强制函数参数为可计数。
To Top