LoginSignup
4
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-04

発端

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した)」ことにする処理が入っていますが、どっちにしろ「フィルタリング対象となる変数・インスタンスは、フィルタリングする前に文字列に変換される」ということには変わりないです。
コールバックフィルタの場合は、その「コールバックフィルタ自体」がフィルタリング処理に当たるので、事前に文字列に変換されてから変数が渡される、ということです。

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

4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3