PHP
Filter

FILTER_CALLBACKで受け取る変数は常に文字列になる

More than 1 year has passed since last update.

発端

FILTER_CALLBACKで、受け取った変数の型によってインスタンス生成するValidatorを分けようと思ってたら、stringしか取れなくて、びびった:fearful:

検証用で書いたやつ

<?php
$result = filter_var(
    2,
    FILTER_CALLBACK,
    [
        'options' => function ($value) {
            return $value;
        }
    ]
);
var_dump($result); // string(1) "2"

この実装(≒仕様)にハマることは多分ない

以下の理由から、この挙動に意図せず"嵌まる"ことは、殆ど無いと思います。

  • 型の検証までしたい場合は、大抵、VALIDATEフィルタを使うし、それで事足りる。
  • 各フレームワークが、Validator(Validation)コンポーネントを提供してるし、普通そっちを使う。

文字列に変換してる箇所

ここで、呼び出されるフィルタに関係なく、文字列に変換してます。

正確には、convert_to_string() を呼ぶ前に、「オブジェクトとかであるために、文字列に変換できなかったら、フィルタリングで失敗した(failした)」ことにする処理が入っていますが、どっちにしろ「フィルタリング対象となる変数・インスタンスは、フィルタリングする前に文字列に変換される」ということには変わりないです。
コールバックフィルタの場合は、その「コールバックフィルタ自体」がフィルタリング処理に当たるので、事前に文字列に変換されてから変数が渡される、ということです。

ちなみに、さっき確認したら、
ドキュメントに「値をフィルタリングする前に、 内部的に 文字列への変換 が行われることに注意しましょう。」と書かれていました。