darudaru

だるだるしてるエンジニア

PHP5の型宣言(タイプヒンティング)

あんまり自分が活用できていないPHPの型宣言について、今更ですがまとめてみました。ずっと「タイプヒンティング」っていう言葉を使っていたけれど、PHPの公式ドキュメントを読んでいたら型宣言って呼ぶように変わっていたっぽいので、型宣言の言葉の方を使っていきます。

PHP7じゃなくて?というところなのですが、仕事場ではまだまだPHP7の導入は諸々の試験段階で、できてなくてですね…。自分が一番使用処が多いPHP5についてまとめています。

型宣言(タイプヒンティング)とは

PHPの公式ドキュメントによると、下記の通り。

型宣言を使うと、、関数を呼ぶ際に渡すパラメータが特定の型であることを、関数の宣言時に要求できるようになります。 関数に渡された値が不正な型であった場合はエラーとなります。 PHP 5 では、このエラーは recoverable fatal error でした。 PHP 7 では、この場合に TypeError 例外をスローします。

つまり、引数に渡されるパラメータに型を指定できる機能です。

PHP5で型宣言で使える型

全ての型が指定できるわけではありません。

  • クラス名
  • インタフェース名
  • self
  • array
  • callable

※クラス名、インタフェース名、selfはPHP5.0.0以降、arrayはPHP5.1.0以降、callableはPHP5.4.0以降使用可能です ※PHP7だとスカラー型(bool, string, float, int)もサポートしています

使用例

<?php

class Test
{
    // クラス名 : Hogeインスタンス以外はエラー
    public function receiveClass(Hoge $class)
    {
    }

    // インタフェース名:HogeInterfaceのインタフェースを持たない場合はエラー
    public function receiveInterfaceClass(HogeInterface $class)
    {
    }

    // self:Testのインスタンス以外はエラー
    public function receiveSelf(self $class)
    {
    }

    // array:array型以外はエラー
    public function receiveArray(array $array)
    {
    }

    // callable:コールバック以外はエラー
    public function receiveCallable(callable $callback)
    {
    }
}

何が便利なのか

  • バリデーションをする必要がなくなるので、コード量が減る
  • 早めにエラーを検知できる
  • 引数に渡すべき型が見た目でわかりやすい

まとめ

クラス、インタフェース名やarray型など、かなり前からPHPで型宣言をサポートしているにもかかわらず、仕事場のコードで型宣言を使っているプログラムを見ることが少ないのはなぜだろうか…(´-ω-`)

コード量減らせるのもいいけど、コメントで書かれるより何の型を渡すべきかということが見た目でわかりやすいのがいいな。