Help us understand the problem. What is going on with this article?

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした