たなかこういちの資料室

システム開発に携わる筆者があれこれ試したことや学んだことについてのまとめ

PHP 7で関数引数にタイプ指定した場合の動作

PHP 7では、関数引数に(プリミティブでも)タイプ指定できるようになりました。
 
PHP Manual, "Function arguments - Type declarations":
 
今までは、、
 
-----(ここから)-----
function doSomething($a, $b) {...
-----(ここまで)-----
 
これからは、、
 
-----(ここから)-----
function doSomething(string $a, int $b) {...
-----(ここまで)-----
 
と書けます。
 
整数は`int`
ブーリアン`bool`
と書きます。
文字列は`string`浮動小数点数`float`です。
 
なお、Classと`array`については、PHP 5で既にタイプ指定可能でしたのです。
 
 
動作を試しました。
 
 
※リンク先にてコードを確認してください。
 
デフォルトでは、string←→数値の暗黙キャストが実施され、それで引き渡せるなら、一見タイプ違いだったとしても結局エラーになりません。よって、"abc"を数値系引数に引き渡したケース以外は全てパスしました。
 
文字列値"123"と数値123の違いをエラーにしたいときは、
 
-----(ここから)-----
declare(strict_types=1);
-----(ここまで)-----
 
を各ファイルの先頭に書きます。そのファイルでのみ有効です。
 
なお、この「strict_type」をglobalに設定することは出来ないとのことです。
 
PHP RFC: Scalar Type Declarations, "Why Not Add An INI Setting For Default Mode":
 
strictモードの動作を見てみると、、
 
 
※リンク先にてコードを確認してください。
 
int値をfloat引数に引き渡すケースを除いて、全てエラーとなりました。数学的に、整数は小数(実数)の部分集合(≒即ち、サブクラス)であり、精度落ちも生じないので、int→floatのみstrictモードでもokとなるのでしょう。
 
 
<追記>
関数の返り値にもタイプ指定できます。
 
-----(ここから)-----
function doSomething(string $a, int $b): string {...
-----(ここまで)-----
 
関数のプロトタイプの末尾に、コロンを置いてからタイプを記述します。(※なんで前置きにしなかったのでしょう。。もしくは引数の方も後置きにすれば。。)
 
◆以上