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