PHPはPOST送信される値を全て文字列(Stirng型)として受け取ります。
そのため、下記のような関数を実行する場合、都度int型にキャストする必要があると思っていました。
function plusOne(int $num)
{
return $num + 1;
}
$num = $_POST['num'];//"1"が送られてきたとする
$res = plusOne( (int)$num );
var_dump($res);//2が表示される
ただ実際にはキャストをしなくても型エラーを吐きません。
$num = $_POST['num'];//"1"が送られてきたとする
$res = plusOne( $num );
var_dump($res);//エラーにならない
なぜかと思ったのですが、どうやらPHPの型宣言は可能な限り暗黙の型変換を行うためにこういったことが起きるようです。
つまり、上記のコードはString型の"1"をint型の1に変換してplusOne()関数を実行しています。
個人的にはラクで良いやと思うのですが、これでは型宣言を行う意味が少しぼやけてしまう気もします。
もっとカタい言語の経験がある人からしたら「なんじゃこりゃ」という仕様かもしれません。
そういった方はdeclare文でstrictモードを有効にしましょう。
そうすれば厳密な型宣言が可能になります。
<?php
declare(strict_types=1);
おまけ
実際には数字を全てint型に変換するラッパー関数を噛ませるのが良さそうですね。
function exePlusOne(int $num)
{
return $num + 1;
}
function plusOne($num)
{
if(preg_match("/\A[0-9]+\z/",$num) !== 1) return 0;
return exePlusOne((int)$num);
}
var_dump(plusOne('1'));
以上