首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

深入理解 PHP count() 函數實現:數組/對象計數、遞歸模式、Countable 接口、ArrayObject 行為

     編輯:PHP 綜合知識

函數原型

int count(mixed $array_or_countable [, int $mode = COUNT_NORMAL])

參數模式

  • COUNT_NORMAL (0):默認,只計一維元素
  • COUNT_RECURSIVE (1):遞歸計算多維數組總元素數

運行示例

$a1 = [1,2,3,4,5];           count($a1);           // 5
$a2 = ['a','b',['c','d'],'e']; count($a2);           // 4
                                 count($a2, 1);      // 6 (遞歸)
$str = 'hello';               count($str);          // 1
$num = 1;                     count($num);          // 1

// 普通對象
class User { private $name; private $addr; }
$user = new User();           count($user);         // 1
count((array)$user);          // 2 (轉數組後計屬性)

// ArrayObject 子類
class UserAO extends ArrayObject {
    public function count() { return 2; }
}
$userAO = new UserAO();       count($userAO);       // 2 (調用自定義 count)

// Countable 接口
class UserC implements Countable {
    public function count() { return 3; }
}
$userC = new UserC();         count($userC);        // 3

內核實現邏輯 (php_count_recursive)

  1. NULL → 返回 0
  2. 數組 → 調用 php_count_recursive
    • 檢測遞歸訪問次數 > 1 → 發出 E_WARNING 防無限遞歸
    • 計算當前層級元素數
    • mode=1 遞歸進入子數組
  3. 對象 →
    • 檢查 handler->count_elements (ArrayObject 行為) → 調用並返回結果
    • 否則檢查實現 Countable → 調用 count() 方法
    • 以上均否 → 返回 1
  4. 標量/資源 → 返回 1

關鍵點:count_elements vs Countable

機制觸發條件返回值來源
count_elements繼承 ArrayObject 且未重寫 count()父類 ArrayObject::count() (默認 0)
Countableimplements Countable自定義 count() 方法返回值

常見誤區

  1. 對象直接 count 返回 1:需轉數組 count((array)$obj) 計屬性數
  2. 遞歸模式慎用:深層嵌套/循環引用觸發 Warning 且性能差
  3. count() 在循環條件中:PHP 不會優化,建議預存 $len = count($arr)

總結

count() 核心邏輯:數組→遞歸計數(含循環檢測);對象→count_elements/Countable/默認1;標量→1。理解 ArrayObject 與 Countable 的不同行為,正確選擇實現方式。性能敏感場景避免在循環條件重複調用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved