タイプヒンティング(型宣言)についてのまとめ
PHPのタイプヒンティング(型宣言) - Qiitaという記事を読んだので、自分なりにまとめておこうと思う。
タイプヒンティング(型宣言)とは
関数に渡す引数が、特定の型であることを関数の宣言時に要求できるようになる。
タイプヒンティングのメリット
1.引数の型が分かりやすい
引数の隣に明示的に型が書いてあるので分かりやすい
2.エラー検知
違う方を引数に渡した場合、関数宣言時にCatchable fatal errorが発生するため、原因の特定が楽。しかもcatch可能。
3.無駄な型判定のコードを書かなくて済む
関数の宣言時に型判定をしてくれる
PHPのタイプヒンティング
現段階ではすべての型を指定できるわけでは無い。
PHP5.4まではself, array, callable, クラス名・インターフェイス名のみ
PHP7からはbool, float, stringの指定ができる。
クラス名・インターフェイス名の指定
class Test { private $hoge; public function __construct(Hoge $hoge = null) // タイプヒンティング { $this->hoge = $hoge ?: new Hoge(); } }
この場合、Hogeクラスのインスタンスでなければエラーになる。
しかし、引数の部分で以下のように指定しているため、nullの場合はエラーが出ない。
Hoge $hoge = null
PHP7のタイプヒンティング
弱い型検査と厳密な型検査の2つのモードがある。
弱い型検査がデフォルトになっているので、厳密な型検査を使いたい場合は以下をファイルの先頭に入力する。
declare(strict_types=1);
弱い型検査
function foo (float $bar){} foo(3); // OK foo(‘123’); // OK foo(‘abc’); // NG
数値型文字列であれば、暗黙的に型変換してくれる。
厳密な型検査
他の静的型付け言語の経験者が望んだ機能。
function foo(int $bar) { echo $bar; }
上記の関数に数値や文字列を渡すといった、プログラマの間違いを発見できるようにしてほしい。という考え方である。
PHPが提供している厳密な型検査は以下の通り
function foo(int $bar) {} function fizz(float $buzz) {} foo(123); // OK foo(‘123’); // NG fizz(123); // OK
数値型文字列でもint型ではないので、NG。
最後に
PHP7になり、弱いタイプヒンティングと厳密なタイプヒンティングの2つを選べるようになったが、どちらかだけを使えれば良いというわけではない。
自分が使っていないタイプヒンティングが使われているコードを見る、もしくは修正する機会があるだろう。
そういう場合のためにも、やはりどちらの知識もしておく必要がある。
もしかしたら、「このコードを厳密なタイプヒンティングで書き換えてほしい」という事も、無いとは言えない。
今のうちに知識を蓄えておこうと思う。