はじめに
タイトルが非常に釣り(?)っぽくなってしまいました。お詫びします。
引数の型を指定しているにも関わらずTypeError
にならないなと思って確かめてみました。
僕が知らなかっただけであると信じているのですが隠された衝撃の事実が最後にあるので見てください。
参考 ?
<?php
function yabai(int $yabai): void
{
var_dump($yabai);
}
yabai(1); //int(1)
yabai(1.1); //int(1)
yabai('1'); //int(1)
yabai(true); //int(1)
yabai(false); //int(0)
yabai(null); //Fatal error: Uncaught TypeError
yabai([]); //Fatal error: Uncaught TypeError
yabai('a'); //Fatal error: Uncaught TypeError
なんだこれ。キャストできないもの?はエラー出すとかそんなのかなと思ってTypeError
が投げられたものをキャストしてみました。
yabai(((int) null)); //int(0)
yabai(((int) [])); //int(0)
yabai(((int) 'a')); //int(0)
全部キャストできました。TypeError
でるものとでないものの違いがわからないです。
おわり
なんと declare(strict_types=1)
が指定されていないとこういう挙動をするというオチです。存在は知っていたのですがタイプヒンティングしたら関係なくない?と思っていました。いまさらリポジトリ全体にdeclare(strict_types=1)
を適用しちゃうと帰れなくなると思うのでそっと胸にしまっておきます。新規ファイルでは都度指定しようと思います。
型を指定する意味が全くの無意味ではないかもしれませんが、厳密比較の条件文等を書く時false
になってしまうのでまずいのでは?と思いました(小並感)。リファレンス等を見つけられなかったのでご存じの方はコメント等で教えていただければ幸いです。
おまけ
ちなみに戻り値の型も同様な挙動をします。おそろC#
<?php
function yabai($yabai): int
{
return $yabai;
}
var_dump(yabai(1)); //int(1)
var_dump(yabai(1.1)); //int(1)
var_dump(yabai('1')); //int(1)
var_dump(yabai(true)); //int(1)
var_dump(yabai(false)); //int(0)
var_dump(yabai(null)); //Fatal error: Uncaught TypeError
var_dump(yabai([])); //Fatal error: Uncaught TypeError
var_dump(yabai('a')); //Fatal error: Uncaught TypeError
var_dump(yabai(((int) null))); //int(0)
var_dump(yabai(((int) []))); //int(0)
var_dump(yabai(((int) 'a'))); //int(0)