とぎぷろべい

包丁研ぎとプログラミングと米国株投資についてのなんやかんや

関数のパラメータと返り値の型宣言について(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1における関数のパラメータと返り値の型宣言について

<?php

//①パラメータのデータ型を宣言する
$ab = 10;               //int型
$ac = 15;               //int型
$ad = 'だよ~ん。';     //string型

function aaa(int $a1, int $a2) {  //パラメータがint型じゃないととUncaught TypeErrorが出る
  global $ad;           //$adのグローバル宣言
  $aa = $a1 + $a2;      //25
  $bb =$aa. $ad;        //25+だよ~ん。

  return $bb;
}

$ae = aaa($ab, $ac);
echo $ae;               //25だよ~ん。


//②返り値のデータ型も宣言する
$ab = 10;
$ac = 15;
$ad = 'だよ~ん。';

function bbb(int $a1, int $a2): int {  //パラメータと返り値の型指定
  global $ad;
  $aa = $a1 + $a2;      //25
  $bb =$aa. $ad;        //25+だよ~ん。

  
return $bb;           //int型限定で返す
}

$ae = bbb($ab, $ac);
echo $ae;               //25(だよ~ん。はstr型なので返ってこない)

関数のパラメータと返り値には、任意のデータ型を指定することもできます。

 

上記のスクリプト①ではaaa関数のパラメータを2つともint型に型宣言しています。

この宣言により、aaa関数の実行時にパラメータに指定する値はすべてint型でなければFatal Error(Uncaught TypeError)が出るようになります。

 

②ではbbb関数のパラメータだけでなく、返り値の型宣言もしています。

②では返り値をint型に宣言していますので、returnで返ってくる値は「25だよ~ん。」ではなく「25」のみとなります。

 

 

ただここまで見てお気づきの人もいるかもしれませんが、PHPのデータ型検査はかなりフレキシブルです。

もともとPHPには自動型変換機能が実装されています。

 

どういうことかというと、例えば①のスクリプトですが、$abの値を整数の10ではなく文字列の’10’にしたとします。

aaa関数はパラメータの型をintで宣言してるわけですから、今の$abはstr型でErrorの対象になるはずです。

 

でも現実には、str型の$abはPHPに勝手にint型の10に変換されて処理されます。

なのでこの場合はErrorは出ません。

 

また②のスクリプトでも、返り値から’だよ~ん。’が除外されて整数の25だけが返ってきていますが、これも他のプログラミング言語と比較すればおかしな話です。

他のプログラミング言語なら、Errorになってスクリプトは強制終了しているはずです。

 

このように、PHPのデータ型検査はかなりフレキシブルな感じです。

もしこれをもっと厳密な型検査に切り替えたい場合は、PHPファイルの最初のほうの行に「declare(strict_types=1);」と記述してください。

 

この記述があると、②のbbb関数はUncaught TypeErrorになります。

また①の$abの10を'10'に変えた場合でも、aaa関数はUncaught TypeErrorになります。

 

 

以下、データ型宣言の種類の一覧です。

 

array         配列
bool         boolean型・true or false
float         実数
int          整数
string          文字列
クラス名       指定したクラスのインスタンス
インターフェイス名  指定したインターフェイスインスタンス
self           型宣言がおこなわれたクラスと同じクラスのインスタンス
parent         型宣言がおこなわれたクラスの親クラスのインスタンす
callable        callable型
iterable        配列またはTraversableのインスタンス
object          object
mixed          データ型の制限なし

 

 

以上です。