PHPのCountableインタフェースで配列以外をcountする


この記事は「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は便利」ってのがあったら、ぜひ教えてください!