読者です 読者をやめる 読者になる 読者になる

phpで関数やメソッドの引数が配列でもそうでなくてもいいみたいなやつ

そういうのを実装するときに、
与えられた変数が配列じゃなかったときに配列に詰め込みなおす関数

<?php
function force_array($var)
{
    if (!is_array($var)) {
        return array($var);
    }
    return $var;
}

上記のようなものを実装してそれを使っていたのだが、
単に

<?php
(array) $var

とキャストすればいいだけってことにさっき気づいた。(某ソースを眺めていて)


おお、私はなんと無駄なことをしていたのか・・。


ただ微妙に挙動が違うので表にまとめる。

元の値 キャスト後の値 上記のforce_array()後の値
NULL NULL array() array(NULL)
bool true array(true) array(true)
int 1 array(1) array(1)
float 1.1 array(1.1) array(1.1)
string "string" array("string") array("string")
array array(1, 2) array(1, 2) array(1, 2)
array array('k1'=>'v1', 'k2'=>'v2') array('k1'=>'v1', 'k2'=>'v2') array('k1'=>'v1', 'k2'=>'v2')
object new stdClass() array() array(new stdClass())


上記のように NULL と object のときの挙動が違った。
NULL を array にキャストすると 要素0、つまり空の array() になり、
object を array にキャストすると そのプロパティを持った連想配列になる。
詳しくは PHP: 配列 - Manual

objectを1つ、もしくは複数どちらでも引数に取れるような関数を作る場合は
キャストだと問題が起こりそうだな。