PHP7の型ヒンティング徹底解説!弱い型チェックと厳格な型チェックの違い
PHP 7では、スカラー型宣言および戻り値の型宣言において、2種類の型ヒンティング(タイプヒンティング)が提供されています。
- 弱い型チェック(Weak type checking)
- 厳格な型チェック(Strict type checking)
弱い型チェック(Weak type hinting)
デフォルトでは、PHP 7は弱い型チェックモードで動作します。弱い型チェックでは、型宣言と実際の値が一致しなくても、エラーや致命的なエラー(Fatal Error)は一切発生しません。型の不一致が起こった場合でも、そのままコードが実行されます。
この弱い型チェックの挙動は、strict_typesを含むdeclare文によって制御できます。
declare(strict_types=0); // 弱い型チェック:strictの値を0に設定します
弱い型チェックの例1
<?php
$x = 10; // 整数型変数 x = 10
$y = 20.20; // 浮動小数点数 y = 20.20
function add(int $x, int $y){
return $x + $y;
}
echo add($x, $y);
?>出力結果
このコードを実行すると、以下の出力が得られます。
30
解説
上記の例では、パラメータに対してstrictモードを指定していません。変数xには整数10、変数yには浮動小数点数20.20を代入していますが、yがfloat型であってもエラーは発生せず、単に整数値30が出力されます。
弱い型チェックの例2
<?php
function returnadd(int ...$integers){
return array_sum($integers);
}
var_dump(returnadd(2, '3', 4.1));
?>出力結果
上記プログラムの出力は以下の通りです。
int(9)
厳格な型チェック(Strict type hinting)
厳格な型チェックでは、型宣言と実際の値が一致しない場合にFatal Error(致命的エラー)が発生します。つまり、厳格な型チェックは、型宣言と完全に同じ型の変数のみを受け入れ、それ以外の場合はTypeErrorをスローします。
厳格な型チェックを使用する際は、ファイルの最初のステートメントとしてdeclare(strict_types=1);を宣言する必要があります。これを怠るとコンパイルエラーが発生します。また、この宣言は他のインクルードされたファイルには影響せず、宣言したファイルのみに適用される点にも注意が必要です。
さらに、strict_typesディレクティブは完全にコンパイル時に処理されるため、実行時(runtime)に制御することはできません。
厳格な型チェックの例1
<?php
declare(strict_types=1);
function returnadd(float $x, float $y){
return $x + $y;
}
var_dump(returnadd(3.1, 2.1)); // 出力:float(5.2)
var_dump(returnadd(3, "2 days")); // 致命的エラー
?>出力結果
上記の厳格な型チェックプログラムの出力は以下の通りです。
float(5.2)
Fatal error: Uncaught TypeError: Argument 2 passed to returnadd() must be of the type float, string given, called in C:\xampp\htdocs\gud.php on line 7 and defined in C:\xampp\htdocs\gud.php:3 Stack trace: #0 C:\xampp\htdocs\gud.php(7): returnadd(3, '2 days') #1 {main} thrown in C:\xampp\htdocs\gud.php on line 3厳格な型チェックの例2
<?php
declare(strict_types=1); // 厳格モードチェック
$x = '1'; // 文字列
$y = 20; // 整数
function add(int $x, int $y){
return $x + $y;
}
var_dump(add($x, $y));
?>このコードは「Fatal error」を出力します。
上記の厳格な型宣言の例では、strict_typesの値を1に設定しているため、文字列'1'をint型の引数に渡すと、「Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type int, string given」というエラーが出力されます。
-
PHPのinstanceof演算子とは?オブジェクトの型判定方法をわかりやすく解説
はじめにPHPでは、ある変数が特定のクラスのオブジェクト(インスタンス)であるかどうかを判定できます。この目的のために用意されているのが、instanceof 演算子です。instanceof演算子を使うことで、オブジェクト指向プログラミングにおいて型のチェックを行い、安全で堅牢なコードを書くことが可能になります。基本構文$var instanceof クラス名この演算子は、$var が指定したクラスのオブジェクトであればブール値の TRUE(true) を返し、そうでなければ FALSE(false) を返します。基本的な使用例次の例では、instanceof演算子を使って、変数 $a がユ
-
PHPのpi()関数とは?使い方と定義済み定数との対応を実例付きで解説
pi()関数の定義と使い方PHPのpi()関数は、数学定数π(円周率)の値を返す関数です。戻り値はfloat型の「3.14159265359」であり、PHPにあらかじめ定義されている定数M_PIとまったく同じ値になります。構文pi ( void ) : floatパラメータこの関数は引数を受け取りません。引数なしでそのまま呼び出すことができます。戻り値pi()関数は数学定数πの値を返し、定義済みの数学定数M_PIと等価です。数式の中では、M_PIの代わりにpi()関数を使うこともできます。対応するPHPバージョンこの関数はPHP 4.x、PHP 5.x、PHP 7.xのすべてのバージョンで利用