型安全とは何だろうと思い調べてみた

「型安全」とは何だろう、と気になったので、型安全について書かれたQiitaの記事を読んでみた。
分かったことを、こちらにまとめておこうと思う。

型安全について

型を付けるか付けないか、という事でいろいろと意見があるらしい。
どちらにも利点があり、

型を付ける場合は、厳密な型付によって大きな問題になる前にエラーを特定できるようになる。
型を付けない場合は、型付をしない事でコード量が減り、記述がシンプルになる。

PHPは型が無いのだが、そういう言語は実行時に型を推論している。
このような言語は「動的型付け言語」と呼ばれるらしい。
逆にコンパイル時に型付するものは「静的型付け言語」と呼ばれる。

型安全性が低い言語は引数の指定を間違えてもエラーにならない。

//正しいコード
setUserName("tomo", 12)
//エラーになるべきコード
setUserName(12, "tomo")

上記のコードでは、型を認識していればコンパイルの時点でエラーを出力する。
C/C++PHPはキャストができエラーも吐かないので型安全とは言えないらしい。
型安全性の低い言語はあまり使いたくないなぁと思ったのだが、私の覚えた言語は全てキャスト変換できるので、型安全と言えないかもしれない。
キャスト変換ができないから「型安全な言語」というわけでは無いだろうが、キャスト変換できない言語にも触れておこうと思った。

一応、PHPでもPHP7からは型の指定ができるようになったようなので、そちらを触るというのも良いかもしれない。

PHP7でできるようになったことは以下のとおりである。

  • 厳密な型チェックモードに設定できる
  • 関数やメソッドの戻り値の型を指定できる
  • 引数に型を指定できる

注意する点としては、スカラ型の指定をする方法はPHP5とPHP7では互換性が無いこと。
PHP7が広まるまでは、自分の中だけでこの書き方を使う程度に控えておく必要がある。

蛇足

この記事を読んで初めて知ったのだが、以下のようにPHPで計算をすると全てのオペランドはfloatとして評価されるらしい。

$v = 3 + 1 * 0.1

C言語を使っていた時は、int型を使って小数点以下を切り捨てたりしていたのだが...
それを考えると、型付けできる方が良いような気がしてくる。

もう一つ知ったことがある。
PHPでも構造体(もどき)が作れるらしい。

class Controller
{
    function echoText()
    {
        echo "HELLO!!!!!";
    }
}
$obj = (object)["name"=>"tomo", "age"=>12, "Controller"=>new Controller];

var_dump($obj);
echo "<br>";
echo $obj->name . "<br>";
echo $obj->age . "<br>";
echo $obj->Controller->echoText();

出力結果は以下の通り

object(stdClass)#3 (3) { ["name"]=> string(4) "tomo" ["age"]=> int(12) ["Controller"]=> object(Controller)#2 (0) { } } 
tomo
12
HELLO!!!!!

こんな事をしなくてもクラスを作れば良いような気もするが、クラスを作る程でもない時もあるだろう。
覚えておいて損はないと思う。

参考

PHPの型と型安全について(PHP7からのPHPプログラミング) - Qiita