PHPのctype_space関数で引数をintで渡すと…

PHPのctype_space関数(www.php.net)でハマったのでメモ。

HTMLフォームの入力チェックにctype_spaceを使い、入力欄に「9」を入れたところ、空白文字だと判定されてしまいました。原因を探るため、次のコードを実行してみます。

$i = 0;
while ($i < 100) {
  if (ctype_space($i)) {
    echo (string) $i. "は空白文字\n";
  }
  $i++;
}

0も含めたすべての自然数は「空白文字」ではありませんから、何も出力されないはず。と思いきや、9~13と32の6行が出力されてしまいます。

オリジナル画像
図1コードを実行したときの出力

これ、ASCIIコードの10進数ですね…。引数をintのまま渡してしまうと、10は改行(LF)、32は半角空白といった具合に判断されてしまうようです。

というわけで、引数は仕様どおりstringで渡さなくてはなりません。先ほどのコードなら次のように修正します。

$i = 0;
while ($i < 100) {
  $str = (string) $i; // ここでキャスト!
  if (ctype_space($str)) {
    echo $str. "は空白文字\n";
  }
  $i++;
}