実用

PHPと型〜型宣言 (タイプヒンティング)を活用しよう〜

ササテンです。こんにちは!
久々にPHPと本気で向き合ってみようと思いまして、記事を書いてみます。

いきなりですが、皆様はPHPに対してどのような印象をお持ちでしょうか?

PHPは柔軟な言語です。生き物に例えるならばタコのように柔軟であり、変数を柔軟に解釈してプログラムを実行していきます。このように柔軟な言語は、PHPのみならずPerl・Ruby・Pythonを始めとしたLL言語(軽量プログラミング言語)に多く、主にWEBシステムを開発するための言語として、型を明示的に宣言しないスタイルが流行しました。

一方で、近年登場した言語の多くは、型を宣言するスタイルをとっています。Go・Swift・Kotlin・TypeScript(AltJS)を始め、たくさんの言語が思いつくことでしょう。型を宣言するスタイルは、変数に制約を設けることができるため、品質を落としにくいという利点があります。

PHPにも流れにのって型宣言(タイプヒンティング)が登場しましたが、型宣言を使わなくてもプログラムが書けてしまうため、いまいち知られていないという印象があります。PHPで型宣言を活用するには、一工夫が必要になりますので、ここで一つ紹介していきます。

PHPの型宣言を利用するにはPHP7が必要である

PHPで型宣言を利用するには、基本的にPHP5.4以上である必要があります。ただし、PHP5.4の型宣言は不完全であるため、実質はPHP7.0以上の機能であるといえるでしょう。

PHPの型宣言は関数に定義する

PHPの型宣言は、変数宣言に定義するのではなく、関数の引数と戻り値に対して定義します(なお、通常の変数に型宣言を定義する方法は、私が知る限りはなさそうです)。

test関数の引数と戻り値の定義に注目してください。これは「intとstringを受け取り、boolを返す関数ですよ」ということを示しています。ここで重要なことは「PHPで型宣言を活用するためには関数を多用したプログラミングが必要である」という点です。

// intとstringを受け取り、boolを返す関数です
function test(int $num, string $str): bool
{
     // 関数のコードを書く(返却値はboolでなければならない)
     return true;
}

UNIX思想でプログラミングしよう

「UNIXという考え方 その設計思想と哲学」という Mike Gancarz の名著をご存知でしょうか?

UNIX思想には、以下の二つの定理があります。

・定理1 スモール・イズ・ビューティフル
・定理2 1つのプログラムには1つのことをうまくやらせる

PHPで型宣言を活用して品質の良いコードを書くためには、関数化が必要であると先程述べました。なぜUNIX思想を紹介したのかと申しますと、UNIX思想はPHPの型宣言スタイルと相性が良いのです。

つまり、UNIX思想の一つである様々なUNIXコマンドのパイプラインのごとく、細かい関数を組み合わせることによって、一つのPHPプログラムを組み立てていくのです。そうすれば、型宣言をフルに活用することができます。

なお、このスタイルを採用するとどうしても関数が増えてしまいます。関数はある程度の単位でクラス化し、静的関数としてまとめて書いていきましょう。静的関数は状態を持たないので、ユニットテストがやりやすいというメリットもありますしね。

final class Abc
{
    static function def(string $aaa, string $bbb): bool
    {
        // 関数のコードを書く
        // 真偽値を必ず返す
    }

    // ?int は、 NULLもしくはintを返すという意味です。
    static function ghi(string $aaa, string $bbb): ?int
    {
        // 関数のコードを書く
        // NULLもしくは整数を返す
    }
}

まとめ

PHPは、型宣言にマッチしない変数が与えられると、エラーを出力します。

例えば、数値しか想定しないような会員番号であったり、金額といった変数は、intで型宣言を定義するようにしましょう。万が一、金額に文字列が与えられたとしても、エラーの出力によって発生にすぐ気づくことができます。

また、型宣言を活用すると、新人エンジニアも変数の型を意識するようになるというメリットがあります。私は、型の知識やノウハウはC言語で得ましたが、現在使っている言語で学べるのであれば、それに越したことはありません。

ぜひともPHPの型宣言を活用して、品質の良いPHPプログラムを目指していきましょう!

LINEで送る
Pocket

この記事を書いた人・プロフィール
ササテン
ニックネーム: ササテン

前職の会社が倒産したことを機に入社。初めて業務で使用した言語は Perlでした。Perl の精神である「There's More Than One Way To Do It.(やり方は何通りもある)」が気に入っていて、自由度の高いプログラミングスタイルが好きです。

趣味:ゲーム、将棋、麻雀