在日常的PHP 開發過程中,我們常常需要對數組或對象進行遍歷操作。然而,由於PHP 的動態類型特性,我們並不能始終確保傳入的變量是可計數的(即實現了Countable接口或者是一個數組)。如果直接對一個不可計數的變量使用count()或進行foreach遍歷,就可能導致錯誤或警告,尤其是在處理不穩定的外部數據時。
為了解決這個問題,PHP 7.3 引入了is_countable()函數,它用於在調用count()之前判斷一個變量是否是可計數的。這大大提升了代碼的健壯性和容錯性。
is_countable()是PHP 7.3+ 提供的一個內置函數,用於判斷變量是否可以傳入count()函數。其函數原型如下:
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>)
</span></span>
返回值為布爾值,若變量是數組或者實現了Countable接口,返回true ;否則返回false 。
假設我們從外部API 獲取了一組數據,並嘗試對其進行遍歷:
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_data_from_api</span></span><span>();
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$item</span></span><span>) {
</span><span><span class="hljs-comment">// 處理每一項</span></span><span>
}
</span></span>
在理想情況下, $data是一個數組或者可迭代對象。但是如果API 返回的是null 、字符串或者布爾值,上述代碼將引發警告或錯誤。
為避免這種情況發生,我們可以在遍歷之前使用is_countable()進行判斷:
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_data_from_api</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>)) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$item</span></span><span>) {
</span><span><span class="hljs-comment">// 安全地處理每一項</span></span><span>
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 可選:記錄日誌或處理默認行為</span></span><span>
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"收到不可計數的數據類型。"</span></span><span>);
}
</span></span>
這樣即使返回的是null 、整數或其他不可計數的類型,程序也不會崩潰,增強了系統的健壯性。
很多開發者在PHP 7.3 之前使用is_array()來判斷是否可以計數。雖然這在很多場景下是可行的,但它並不能識別那些實現了Countable接口的對象。例如:
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">MyCollection</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">Countable</span></span><span> {
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">count</span></span><span>(</span><span><span class="hljs-params"></span></span><span>): </span><span><span class="hljs-title">int</span></span><span> {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-number">0</span></span><span>;
}
}
</span><span><span class="hljs-variable">$collection</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">MyCollection</span></span><span>();
</span></span>
此時:
<span><span><span class="hljs-title function_ invoke__">is_array</span></span><span>(</span><span><span class="hljs-variable">$collection</span></span><span>); </span><span><span class="hljs-comment">// false</span></span><span>
</span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-variable">$collection</span></span><span>); </span><span><span class="hljs-comment">// true</span></span><span>
</span></span>
因此,在現代PHP 中,應優先使用is_countable()替代is_array() + count()的組合邏輯。
對外部輸入一律做類型檢查:尤其是數據庫查詢、API 響應等可能為空的結構。
統一封裝判斷邏輯:可將is_countable()檢查封裝為通用工具函數,保持代碼整潔。
結合類型提示和靜態分析工具:例如PHPStan 或Psalm,可以進一步減少因類型不明帶來的風險。
is_countable()是一個小而強大的工具,它讓我們在處理不確定數據結構時更加游刃有餘。善用此函數,不僅可以避免運行時錯誤,還能寫出更加魯棒和易維護的PHP 應用。