◆ 数値型として受け取れない
  ◆ int にすると (float)1 はエラー
◆ 複数指定できない
  ◆ 配列または文字列など
◆ strict_types 指定したファイルでの関数呼び出しも型が一致しないといけなくなる

PHP 7 から使えるようになったタイプヒント
C# などのように引数の型を指定できたり 関数やメソッドの返り値の方を指定できたりします

デフォルトはタイプキャスト的な動きです
指定した型以外でも受け入れて 最初にその型にキャストします
キャストできないならエラーになります

あえてヒントとして書くならそれ以外は最初から禁止すべきだと思うので基本は strict にしてキャストではなくエラーになるようにしていました
ですが 使っているとときどきキャストのほうがいいなと思う面もありました

数値型全体を指定できない

まずは数値型の問題
数値型として指定できないので int か float かを指定することになります
両方とも受け取れません

値的には整数であっても型が float なのでエラーになることもあります

$a = 10;
$b = 2;
$c = 3;

var_dump($a, $b, $c);
var_dump($a / $b, $a / $c);
int(2)
int(3)
int(5)
float(3.3333333333333)

PHP では int / int でも割り切れないと float 型になります


$d = 1 / 2;
var_dump($d, $d * 2);
float(0.5)
float(1)

float と計算した結果は整数であっても float です


JavaScript だと型自体が数値 (Number) 型なので扱いやすいですが PHP は変に静的型付け言語風にちゃんとわけてるのでちょっと不便です
JavaScript だと
const d = 1 / 2
console.log(Number.isInteger(d))
console.log(Number.isInteger(d * 2))
false
true
小数と計算したからとか関係なく値が整数なら int 判定してくれます

ここは PHP のほうが多くの言語と同じ動きではありますが JavaScript のになれるとこっちのほうが便利で扱いやすいです

複数指定できない

型はひとつしか指定できません
phpdoc だと 「array | string」 みたいな書き方ができた気もしますがタイプヒントでは 1 つしかサポートしてないようです

動的型付け言語なので 複数はありにしてほしいです
上の int or float もそうですし 返り値には int or bool(false) としたいこともけっこうあると思います
あと NAN は float になるので int にすると返せません

引数オーバーロードができるならまだ多少はましになるのですけど そんな機能はないですからね

呼び出す標準関数も strict を要求される

strict モードにするために 「declare(strict_types=1);」 を使います
この機能はあくまでそのファイルで宣言する関数やメソッドの呼び出し時の引数と返り値のチェックに関係するものだと思ってました
ですが そのファイルから呼び出す標準関数に渡す引数も strict にすることを要求されます

echo date('Y/m/d', microtime(true));

これは普通に実行すると問題なく動きますが 受け取る unixtime は int 型です
そのため ミリ秒以下は無視されます
u, v オプションでミリ秒以下を表示させることはできますが 実質 0 にしかなりません

このコードを strict_types にして実行すると

Fatal error: Uncaught TypeError: date() expects parameter 2 to be integer, float given

エラーになります
int と float なんかはどっちを取るなんてあまり気にせず使っていたので地味に面倒です

おまけ nullable マークの場所が変

7 がリリースされた頃は null を許可するためにはデフォルト値を null にしないといけないという変な仕様だった気がします
省略された場合のデフォルト値は別にしたいのに null を許容するために null にして関数内で設定しないといけないという手間が発生します

それがいつのまにか nullable 対応していたようです
書き方は

function fn(?string $s, ?int $i){
var_dump($s, $i);
}
fn(null, null);
NULL
NULL

? が先に来てます

C# とか Swift とか Kotlin などでは String! や int? のように null 関係の記号が後ろに来ます
なのに PHP では先です

いつもながら周りに合わせない独自路線
とりあえず他の言語とは逆のものを選ぶというのが PHP の考え方なんですかね