はじめに
アドベントカレンダー12/16 = 16記事目になります
PHPのコードを読んでいると、
ctype_digit() という関数を見かけることがあります。
PHP学び始めて間もない私は以下のような点で疑問を感じました
- 数字チェックって
is_numeric()と何が違うの? - なんで (string) にキャストしてるの?
- どんな場面で使うの?
そこで今回は、ctype_digit() の基本的な使い方から、他の数字判定との違い、実務での使われ方まで、分かりやすくまとめて紹介します。
ctype_digit() とは?
ctype_digit() は「文字列がすべて数字で構成されているか」を判定する関数になります
ctype_digit("1234"); // true(全部数字)
ctype_digit("12ab"); // false(アルファベットが混ざっているため)
◆重要ポイント:引数は必ず「文字列」である必要がある
数値型(int)を渡すと false を返してしまうため、基本的に以下のようにキャストします。
※キャスト=「このデータを○○として扱ってね」と PHP に指示すること
$age = 25;
ctype_digit((string)$age); // true
「数字かどうか」判定は他にもあるのに、なぜ使うのか?
PHPには数字チェック用の関数が複数あり、私自身混乱しています
◆ is_numeric() との違い
| 関数 | true になる例 | false になる例 | 特徴 |
|---|---|---|---|
| ctype_digit() | "123" | "-5", "12.3", 123(int) | 文字列で、0–9 のみOK |
| is_numeric() | "123", "-5", "12.3", 123 | "12a" | 数字として解釈できればOK |
つまり:
- 「すべて数字の文字列であること」を厳密にチェックしたい → ctype_digit()
- 数値として扱えるかどうかをチェックしたい → is_numeric()
このように用途が違うのがポイントになるかと。
どんな場面で使うのか?
調べた中で見つけた使用例を少しアレンジして紹介したいと思います
◆ 1. フォームから送られてきた ID が数字だけか判断したいとき
URLパラメータやPOSTデータは「全部文字列」です。
// URL例:?id=123
$id = $_GET['id'];
if (!ctype_digit($id)) {
echo "不正なIDです";
exit;
}
SQLインジェクション対策の一環として、
「IDは数字のみ」という制約をチェックする場面で使用
◆ 2. 年齢や個数など、整数しか受け付けたくない入力チェック
$age = $_POST['age'];
if (!ctype_digit($age)) {
echo "年齢は数字のみで入力してください";
}
ユーザーが
- 全角数字「123」
- マイナス記号「-5」
- 小数「12.5」
などを入力しても弾けるため、安全で扱いやすいのが特徴的
◆ 3. プログラム内部では整数なのに、APIや外部データが文字列の場合
APIレスポンスが全部文字列というケースは多いらしく
そのとき、数字らしいけど本当に数字だけなのか確認したい場合に使用される
$value = $apiResponse['count'];
if (ctype_digit($value)) {
$count = (int)$value;
}
間違いやすいポイント
◆(1)int を渡すと false になる
ctype_digit(123); // false
理由:引数は「文字列」であることが前提だから。
→ 必ず (string) をつけるのが安全
◆(2)小数・マイナスは数字として扱われない
ctype_digit("12.3"); // false
ctype_digit("-5"); // false
あくまでも
「0〜9 の数字だけで構成された文字列」
かどうかを判定する関数だから
さいごに
-
ctype_digit()は「文字列がすべて数字か」を判定する関数 - 引数は文字列である必要がある(int は false になる)
-
is_numeric()と目的が異なる - フォーム入力やURLパラメータの検証など、実務でよく使われる
どの数字判定を使えばいいのか分かりにくいですが、
「文字列として数字だけ?」を調べたいなら ctype_digit()、
「数値として扱える?」を調べたいなら is_numeric() と思っておけばひとまずはよさそうな感じがしています。
参考記事