10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GameWithAdvent Calendar 2019

Day 3

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

Posted at

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

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?