タイプヒンティング(型宣言)についてのまとめ

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つを選べるようになったが、どちらかだけを使えれば良いというわけではない。
自分が使っていないタイプヒンティングが使われているコードを見る、もしくは修正する機会があるだろう。
そういう場合のためにも、やはりどちらの知識もしておく必要がある。
もしかしたら、「このコードを厳密なタイプヒンティングで書き換えてほしい」という事も、無いとは言えない。

今のうちに知識を蓄えておこうと思う。

参考

PHPのタイプヒンティング(型宣言) - Qiita

【導入決定!】PHP7で実装されるスカラー型宣言とは? | 東北ギーク

初心者向け タイプヒンティングとはなんなのかというお話