【PHP】タイプヒンティングで安心安全なコードを書こう!!

2022/04/24

はじめまして!ヨコイと申します。

今回はPHPのタイプヒンティングについて書いていきたいと思います。
正確な記述を心がけているつもりではありますが、誤った記述を行っている可能性もございますのでご了承願います。

タイプヒンティングとは?

そもそもタイプヒンティングとはなんなのでしょうか?
こちら型宣言とも呼ばれ、型を定義するものになります。
」とはつまりデータの形式を表したものになります。文字列であればstring、数値であればintなどなど。

PHPは動的型付言語と呼ばれる言語で、「型」については自動で解釈してくれるのですが、実装者の意図とは異なる解釈が行われ不具合が発生する可能性があります。
そのため近年では静的型付言語と呼ばれる、実装者が型を明示的に記述する言語が注目されています。
PHPにおける型宣言とは上記の静的型付言語のように型を指定することができるようになるというものです。
各種パラメータが宣言された型と一致しない場合にはTypeErrorがスローされます。

基本的な型

以下に基本的な型を示します。

  • string 入力パラメータが文字列であることを保証します 例)'test'、'01' 、'サンプルテキスト'
  • int 入力パラメータが数値であることを保証します 例)1、35、9999
  • float 入力パラメータが浮動少数点数であることを保証します 例)0.01、1.2e3、7E-10
  • bool 入力パラメータが真理値(trueかfalseのどちらかの値)であることを保証します
  • array 入力パラメータが配列であることを保証します 例)[0, 'test', 3, 9]
  • object 入力パラメータがオブジェクトであることを保証します 例){name: 'ヨコイ'}

このほかにも存在しますが、業務でよく使用されるのは上記に加えてクラスなどを指定することがほとんどです。
フレームワークとしてLaravelを使用する場合にはmodelCollectionを返すことが多いです。

コードでの使用例

では実際のコードを例にとってみてみましょう。

public function getPersonInfo(string $name, int $age): string
{
  return $name. 'さん(' .$age. '歳)';
}

上記のコードは名前と年齢を取得してそれらを一つの文字列として返却しています。
年齢には基本数値しか(十三などの表記もありますが)入らないのでintで型を指定しています。
引数だけでなく戻り値にも型を指定することができます。こうすることで関数を呼び出す際に、どんな値が返ってくるのかを把握することが容易になります。

public function makeClassList(array $students, string $className): array
{
  foreach($students as $studentInfo){
    array_push($studentInfo, {className: $className});
  }
  return $students;
}

次の例では引数で受け取った配列をforeachで回しています。こちらのコードは引数$studentsに配列以外の値が入ってしまうとうまく動作しなくなってしまいます。arrayで型宣言を行うことでリスクを減らせると思います。

まとめ

いちいち型を指定するのは面倒だとの意見もあるかもしれませんが、ある程度開発規模が大きくなってきますとバグが混入する確率が上がってしまいます。データのやり取りが正しく行われるように制御することでバグの混入を最小限に食い止めることができるのではないでしょうか?
タイプヒントを使用した経験がないよ。という方も使用を検討してみてはいかがでしょうか?