LoginSignup
13
4

More than 1 year has passed since last update.

PHPのタイプヒンティングがやばい

Last updated at Posted at 2022-05-19

はじめに

タイトルが非常に釣り(?)っぽくなってしまいました。お詫びします。
引数の型を指定しているにも関わらず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)
13
4
0

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
13
4