目次(クリックするとジャンプします)1:型宣言(タイプヒンティング)1.1:array型ではどうだろう2:知らないうちに「暗黙の型変換」3:ちゃんと型検査したい時には4:型変換の意義5:まとめ関連するこちらの記事もオススメbashのキーバインドを覚えて快適コマンドライン生活ターミナルマルチプレクサscreenでキーバインドを連続的に操作するPHPって型宣言(タイプヒンティング)してもint型がstring型に型変換されるの?tmuxでtmuxinatorを使う時の256色問題Linuxでディレクトリやファイルの容量を確認する「duコマンド」[使い方基本版]DockerComposeでコンテナ立ち上げ・連携を楽にするjQueryで「ページトップへ戻る」機能を作る方法(opacityを使用)PHPでデザインパターンを勉強するなら参考にしたい書籍・Webサイト型宣言(タイプヒンティング)PHPには型宣言に落とし穴があります。例外のテストの方法を勉強していて遭遇した現象です。すごく簡素ですが、こんな感じのコードとテストを書いて再現してみます。}}コードを見ていただければわかるかと思いますが、typeError関数の引数はPHP7から導入されたスカラー型の型宣言をしています。stringを宣言しているので、文字列のみが引数として許されることになるはずです。PHP7からは型宣言に抵触すると、TypeErrorという例外が投げられることになります。テストコードでは@expectedExceptionアノテーションにてTypeErrorを指定して補足する準備をしています。このテストはTypeErrorが補足できたら成功というテストです。$dataにint型である数字の1を格納しtypeErrorに渡しています。typeErrorの引数はstring型で型宣言しているのですから、int型の値を与えるとTypeErrorがスローされ、このテストは成功するはずです。テストでは以下の出力がされます。thrown.これはTypeErrorの補足に失敗したことを意味します。array型ではどうだろうではテストを成功させるために別な型を使ってみます。}}値を配列(array型)にしてみました。assertions)成功しました。TypeErrorを補足できたということですね。いうことなんだろう?知らないうちに「暗黙の型変換」よくよく調べて見ると、PHPの型宣言は弱い型検査らしく、型宣言をしてもint、stringは可能な限り型変換が行われるようです。int、stringだけでなくint、float、string、boolは互いに暗黙の型変換が行われるようですよ。それだと型宣言の意味あるのかな〜。型検査したい時にはこの暗黙の型変換を回避するにはstrict(厳密)モードにする必要があります。以下をファイルの先頭にの記述します。declare(strict_types=1)これでint、float以外の暗黙の型変換は行われなくなるようです。}}ちゃんとテストが成功します。型変換は行われずTypeErrorがスローされたということです。型変換に関してやっぱりPHPという感じです。動的型付けの言語ですし、型を意識しない言語でもあります。弱い型検査はPHPの使用感を保つには理にかなっているかもしれません。他の静的型付け言語の様に厳密をデフォルトとするのはPHPにはそぐわない気もします。切り替えができるようにしてくれたのは吉と出るか凶とでるか...。型宣言を厳密に行いたいときはdeclare(strict_types=1)を忘れずに。mino長年働いていた会社をリストラされてしまったおっさん。なにを思ったか未経験のプログラミングで再起を図ろうとする。プログラミングを勉強していく上で苦しんだこと、ハマったことを中心に記事を書きます。