この記事は「GameWith Advent Calendar 2019」の3日目の記事です。
概要
PHPのcount()
は、配列の個数を数えるときによく使う関数です。ただ実は配列以外も数えることができます。
それがタイトルにも書いた、「Countableインタフェース」です。このインタフェースを実装したオブジェクトもcount()
することができます。意外と情報が少なそうだったのでまとめてみました。
使い方
Countable
を実装したクラスに対して、count()
メソッドを定義します。
class MyCountable implements Countable
{
private $num = 255;
public function count()
{
return $this->num;
}
}
Countable
を実装したオブジェクトは次のようにcount()
関数で数えることが可能で、結果は自分で定義したcount()
の結果を返すことができます。
$counter = new MyCountable();
var_dump(count($counter)); // int(255)
count可能かのチェック
count()
可能かのチェックは、PHP7.3以降の場合は「is_countable」で、配列に加えてCountable
のオブジェクトもチェックすることができます。
$counter = new MyCountable();
if (is_countable($counter)) {
var_dump(count($counter)); // int(255)
}
PHP7.3未満の場合は少し手間ですが、is_array()
とinstanceof
を併用してチェックするのが良いと思います。
$counter = new MyCountable();
if (is_array($counter) || $counter instanceof Countable) {
var_dump(count($counter)); // int(255)
}
注意点
次のようにint
以外の値を返すようにした場合、実行はできますがint
にキャストされた結果が返ってきます。
class MyCountable implements Countable
{
private $num = 'test';
public function count()
{
return $this->num;
}
}
$counter = new MyCountable();
var_dump(count($counter)); // int(0)
まとめ
Countable
インタフェースはPHP5からありましたが、私も最近まで存在を知らずis_countable()
関数の追加で初めて知り、今回紹介をしてみました。
もし「こんな風に使うとCountable
は便利」ってのがあったら、ぜひ教えてください!