PHP Conference Japan 2024

Countable 接口

(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 年前
请注意,数组没有实现 Countable。因此,如果您希望函数也适用于原生数组,则无法为函数强制使用 Countable 参数。
To Top