今更ながら知ったので書く。
sample.php
$foo1 = $_POST['foo'] ?? null;
$foo2 = filter_input(INPUT_POST, 'foo');
の違いがわかってませんでした。
<from action="sample.php" method="post">
<input type="hidden" name="foo" value="foo">
<input type="submit">
</form>
上記をsubmitすると
sample.php
<?php
$foo1 = $_POST['foo'] ?? null;
$foo2 = filter_input(INPUT_POST, 'foo');
var_dump($foo1);
// string(3) "foo"
var_dump($foo2);
// string(3) "foo"
どちらも結果は同じ
sample.php
<?php
$_POST['foo'] = 'bar'; // $_POSTの値を書き換える
$foo1 = $_POST['foo'] ?? null;
$foo2 = filter_input(INPUT_POST, 'foo');
var_dump($foo1);
// string(3) "bar"
var_dump($foo2);
// string(3) "foo"
$_POSTの値を直接書き換えると結果が変わった。
filter_input()はHTTPボディから参照しているっぽい。
$_POST書き換えるなよって話しですが、(書き換えたことあります。ごめんなさい。)
#気になったこと
https://www.php.net/manual/ja/function.filter-input.php
返り値
成功した場合は要求された変数の値、フィルタリングに失敗した場合に FALSE、 あるいは変数 variable_name が設定されていない場合に NULL を返します。フラグ FILTER_NULL_ON_FAILURE が指定されている場合は、変数が設定されていなければ FALSE、 フィルタリングに失敗したら NULL を返します。
返り値のfalseってなに。
変数が設定されてない場合はnullじゃないの。
<input type="hidden" name="foo[]" value="hoge">
<input type="hidden" name="foo[]" value="fuga">
sample.php
<?php
$foo1 = $_POST['foo'] ?? null;
$foo2 = filter_input(INPUT_POST, 'foo');
var_dump($foo1);
// array(2) { [0]=> string(4) "hoge" [1]=> string(4) "fuga" }
var_dump($foo2);
// bool(false)
配列を渡すとfalseが帰ってくる。
#配列の受け取り
sample.php
<?php
$foo2 = filter_input(INPUT_POST, 'foo', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
var_dump($foo2); // array(2) { [0]=> string(4) "hoge" [1]=> string(4) "fuga" }
第4引数にFILTER_REQUIRE_ARRAYを指定すると配列を受け取れる。
#オプションとかで色々指定できるっぽい
<input type="hidden" name="foo" value="30">
sample.php
<?php
$foo1 = $_POST['foo'] ?? null;
$foo2 = filter_input(INPUT_POST, 'foo', FILTER_VALIDATE_INT, [
"options" => [
"max_range" => 20,
"min_range" => 10
]
]);
var_dump($foo1); // string(2) "30"
var_dump($foo2); // bool(false)
この場合もfalseが帰ってくる。