発端
FILTER_CALLBACKで、受け取った変数の型によってインスタンス生成するValidatorを分けようと思ってたら、stringしか取れなくて、びびった
検証用で書いたやつ
<?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した)」ことにする処理が入っていますが、どっちにしろ「フィルタリング対象となる変数・インスタンスは、フィルタリングする前に文字列に変換される」ということには変わりないです。
コールバックフィルタの場合は、その「コールバックフィルタ自体」がフィルタリング処理に当たるので、事前に文字列に変換されてから変数が渡される、ということです。
ちなみに、さっき確認したら、
ドキュメントに「値をフィルタリングする前に、 内部的に 文字列への変換 が行われることに注意しましょう。」と書かれていました。