PHP Conference Japan 2024

Countable 介面

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

簡介

實作 Countable 介面的類別可以使用 count() 函式。

介面概要

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

目錄

新增註釋

使用者貢獻筆記 3 則筆記

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",符合預期
?>
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
類別 計數器 實作 可計數 {
公開 函式
計數() {
// 單個 /32 IPv6 分配中的 IPv6 地址數量 (2^96)
返回 18446744073709551616;
}
}

$obj = 新 計數器();

回應
$obj->計數(); // 顯示浮點數 18446744073709551616.000000
回應 計數($obj); // 顯示整數 0

// 這是因為類型轉換
回應 (整數) 18446744073709551616; // 顯示整數 0
?>

只有在計數高於 PHP_INT_MAX 時才會出現此問題。
匿名
13 年前
請注意,陣列並未實作可計數介面。因此,如果您希望函式也能與原生陣列一起使用,則無法強制使用可計數參數。
To Top