PHPの型宣言を使って安全なプログラムを書いてみよう!

こんにちは!つい最近開発部に入った豊島です。
今回はPHP 7.0以降にアップデートされた型宣言についてご紹介したいと思います。

早速ではありますが、コーディングをしているときに変数に代入したデータの型が違ってエラーが出たことってありませんか?

最近では大規模なシステム開発にもPHPが採用されることもあり、莫大なコード量になったときに型が問題で予期しないエラーが出る場合があります。
そんな時のために、型を意識してコーディングすることでエラーを回避することが可能です!

そこで今回の記事では、型宣言についてご紹介させていただきます!

    目次

・PHPにおける変数について
・PHPのデータ型に関する機能について
—  関数の引数に型宣言をする
—  関数の返り値に型宣言をする
—  おまけ(比較演算子(===))について

    PHPにおける変数について

PHPでは、整数を変数に代入すればint型、文字列を代入すればstring型になり暗黙の了解的なところで変数の型は自動で決まります。
変数を作るときに型を定義する必要がないことが特徴です。
一方でJavaやC言語といった他の言語では、変数にも型宣言をする必要があります。

// 例
  $string = "abc";       //文字列を代入
  var_dump($string);     //string(3) "abc" string型になる
  $int = 123;            //整数を代入
  var_dump($int);        //int(123) int型になる 

  // Javaの場合
  String string;   //string型の変数stringを宣言する
  int integer;           //int型の変数integerを宣言する

  // 宣言したデータ型でなければ代入できません

上記の例からもPHPは型について意識しなくてもコーディングができてしまいます。
しかし、この場合は変数にどの型のデータが入っているのかがわからず、想定外のバグが発生する可能性もあります。

    PHPのデータ型に関する機能について

関数の引数に型宣言をする

// 引数を2倍にして返すプログラム
function doubleInt(int $int){
return $int * 2;
}
echo doubleInt(10); //20と出力される
echo doubleInt("abc"); //エラーになる

関数に引数を指定することで数値(int)以外のデータ型が渡されたときにエラーが出る。
また、関数内で変換コードを書くこともなくシンプルに関数内をまとめることができます。
万が一、違う方が渡された時もエラーが出てプログラムが終了するので安心です。

関数の返り値に型宣言をする

先ほどの1でご紹介した関数の戻り値をint型を指定しているにも関わらず文字列が戻り値として出力されるプログラムの場合についてご紹介します。

function doubleInt(int $int): int{
return "龍野情報システム";
}
echo doubleInt(10); //エラーになる

大規模なシステム開発になると関数内のコードについても複雑になります。
処理が的確に行われ、異常な戻り値にならないように戻り値にも型を指定することで想定外のバグを避けることができます。

※PHP7.4以降ではプロパティについても型宣言が可能になりました。興味のある方は公式マニュアルを確認してみてください。

おまけ(比較演算子(===))について

こちらは過去に私自身も経験したことがあるためご参考にしていただければ幸いです。

比較演算子(==)と(===)の違いについて

(==)の場合は、比較対象が別のデータ型であっても自動的に型変換して比較実行します。
一方、(===)の場合は、型変更することなく比較実行を行います。

PHP公式マニュアルには、
(===)は厳密な比較、(==)は緩やかな比較と表現されています。

//例
//数値での比較
var_dump(12345 == '12345'); //bool(true) 想定外ではあるが便利な時もある
var_dump(12345 === '12345'); //bool(false)

//数値+文字列での比較
var_dump(12345 == '12345tatsuno'); //bool(true) 想定外
var_dump(12345 === '12345tatsuno'); //bool(false)

var_dump(12345 == '12345abcde'); //bool(true) 想定外
var_dump(12345 === '12345abcde'); //bool(false)

var_dump('tatsuno' == 0); //bool(true) 想定外
var_dump('tatsuno' === 0); //bool(false)

※(==)での数値と文字列の比較では、どちらかの値に数値が含まれている場合は、文字列を数値に変換してから比較を行います。
その結果(12345 == ‘12345tatsuno’)は(12345 == 12345)となりtrueとなります。
また、(‘tatsuno’ == 0)の場合は、(null == 0)となりこちらもtrueになります。

このように(==)演算子で比較する場合は、想定外のバグを生む可能性があります。
基本的には、(===)演算子で比較を実行することで安全なプログラムにすることができます。

    まとめ

如何だったでしょうか?
普段何気なく型変換されていてコーディングしていた方(少ないかと思いますが…)やこれからプログラミングを学ぼうとしている方のご参考になれば幸いです。
より安全なプログラムが書けるよう型を意識してコーディングしていきましょう!

以上、ありがとうございました!!

jaJapanese