サーチ…
構文
- 関数f(ClassName $ param){}
- 関数f(bool $ param){}
- 関数f(int $ param){}
- 関数f(float $ param){}
- 関数f(文字列$ param){}
- 関数f(self $ param){}
- 関数f(呼び出し可能な$ param){}
- 関数f(配列$ param){}
- 関数f(?type_name $ param){}
- 関数f():型名{}
- 関数f():void {}
- 関数f():?type_name {}
備考
型ヒントまたは型宣言は、関数のパラメータが指定された型のものであることを保証する防御的なプログラミングの方法です。これは、提供されたパラメータがインタフェースで必要とされるのと同じメソッドを持つことを関数が保証することができるため、インタフェースの型ヒント時に特に便利です。
間違った型を型ヒント関数に渡すと、致命的なエラーが発生します。
致命的なエラー:Uncaught TypeError: foo()に渡された引数Xは、 RequiredType 、 ProvidedTypeの型でなければなりません
ヒンティングスカラー型、配列、呼び出し可能型
タイプヒント配列パラメータ(およびPHP 7.1以降の戻り値)のサポートは、PHP 5.1でキーワードarray
とともに追加されました。任意のディメンションとタイプの配列、空の配列は有効な値です。
PHP 5.4では、ヒンティング型の呼び出し可能型のサポートが追加されました。 is_callable()
値は、 callable
ヒント、つまりClosure
オブジェクト、関数名文字列、 array(class_name|object, method_name)
パラメータと戻り値に対して有効です。
is_callable()
ではないように、関数名にタイプミスがあると、それほど明白ではないエラーメッセージが表示されます。
致命的なエラー:Uncaught TypeError:foo()に渡される引数1は、callable型、string / array型でなければなりません
function foo(callable $c) {}
foo("count"); // valid
foo("Phar::running"); // valid
foo(["Phar", "running"); // valid
foo([new ReflectionClass("stdClass"), "getName"]); // valid
foo(function() {}); // valid
foo("no_such_function"); // callable expected, string given
非静的メソッドは、静的フォーマットの呼び出し可能関数として渡すこともでき、PHP 7とPHP 5ではそれぞれ非推奨警告とレベルE_STRICTエラーが発生します。
メソッドの可視性が考慮されます。 callable
パラメータを持つメソッドのコンテキストが、提供された呼び出し可能な呼び出しにアクセスできない場合、メソッドが存在しないかのように終了します。
class Foo{
private static function f(){
echo "Good" . PHP_EOL;
}
public static function r(callable $c){
$c();
}
}
function r(callable $c){}
Foo::r(["Foo", "f"]);
r(["Foo", "f"]);
出力:
致命的なエラー:Uncaught TypeError:r()に渡された引数1は、呼び出し可能でなければならず、配列は指定されていなければなりません
型ヒンティングスカラー型のサポートがPHP 7で追加されました。これは、 boolean
s、 integer
s、 float
integer
s、およびstring
sに対する型ヒントサポートを取得することを意味しstring
。
<?php
function add(int $a, int $b) {
return $a + $b;
}
var_dump(add(1, 2)); // Outputs "int(3)"
デフォルトでは、PHPは指定された引数を型ヒントに合わせてキャストしようとします。 float 1.5
がPHPによってint
にキャストされたため、 add(1.5, 2)
1.5,2)の呼び出しを変更するとadd(1.5, 2)
まったく同じ出力が得られます。
この動作を停止declare(strict_types=1);
は、 declare(strict_types=1);
追加declare(strict_types=1);
必要がありdeclare(strict_types=1);
それを必要とするすべてのPHPソースファイルの先頭に追加します。
<?php
declare(strict_types=1);
function add(int $a, int $b) {
return $a + $b;
}
var_dump(add(1.5, 2));
上記のスクリプトで致命的なエラーが発生するようになりました。
致命的なエラー:キャッチされていないTypeError:add()に渡された引数1は整数型でfloatが指定されている必要があります
例外:特殊なタイプ
PHP関数の中には、 resource
型の値を返すものがあります。これはスカラー型ではなく特殊型なので、ヒントをタイプすることはできません。
たとえば、 curl_init()
はfopen()
と同様にresource
を返します。もちろん、これら2つのリソースは互いに互換性がありません。そのため、PHP 7は、タイプヒントresource
明示的に指定すると、 常に次のTypeErrorをスローします。
TypeError:sample()に渡される引数1は、指定されたリソースのインスタンスでなければなりません
タイプヒントジェネリックオブジェクト
PHPオブジェクトは基本クラス( stdClass
を含む)を継承しないため、汎用オブジェクト型をヒントする型はサポートされていません。
例えば、以下は動作しません。
<?php
function doSomething(object $obj) {
return $obj;
}
class ClassOne {}
class ClassTwo {}
$classOne= new ClassOne();
$classTwo= new ClassTwo();
doSomething($classOne);
doSomething($classTwo);
そして、致命的なエラーをスローする:
致命的なエラー:Uncaught TypeError:doSomething()に渡された引数1は、指定されたOperationOneのインスタンスであるobjectのインスタンスでなければなりません
これを回避するには、メソッドを定義しない縮退インタフェースを宣言し、すべてのオブジェクトでこのインタフェースを実装する必要があります。
<?php
interface Object {}
function doSomething(Object $obj) {
return $obj;
}
class ClassOne implements Object {}
class ClassTwo implements Object {}
$classOne = new ClassOne();
$classTwo = new ClassTwo();
doSomething($classOne);
doSomething($classTwo);
タイプのヒントクラスとインターフェイス
PHP 5では、クラスとインタフェースのヒントが追加されました。
クラスタイプのヒント
<?php
class Student
{
public $name = 'Chris';
}
class School
{
public $name = 'University of Edinburgh';
}
function enroll(Student $student, School $school)
{
echo $student->name . ' is being enrolled at ' . $school->name;
}
$student = new Student();
$school = new School();
enroll($student, $school);
上記のスクリプトは、
クリスはエジンバラ大学に入学しています
インターフェイスタイプのヒント
<?php
interface Enrollable {};
interface Attendable {};
class Chris implements Enrollable
{
public $name = 'Chris';
}
class UniversityOfEdinburgh implements Attendable
{
public $name = 'University of Edinburgh';
}
function enroll(Enrollable $enrollee, Attendable $premises)
{
echo $enrollee->name . ' is being enrolled at ' . $premises->name;
}
$chris = new Chris();
$edinburgh = new UniversityOfEdinburgh();
enroll($chris, $edinburgh);
上記の例は前と同じ結果を出力します:
クリスはエジンバラ大学に入学しています
自己タイプのヒント
self
キーワードは、値がメソッドを宣言するクラスのインスタンスでなければならないことを示すヒントとして使用できます。
タイプヒントなし戻り値(無効)
PHP 7.1では、 void
戻り値の型が追加されました。 PHPには実際のvoid
値はありませんが、何も返さない関数がvoid
を返すということは、プログラミング言語全体で理解されていvoid
。これは、帰国と混同すべきではないnull
よう、 null
返される可能性が値です。
function lacks_return(): void {
// valid
}
void
リターンを宣言した場合、値を返すことはできません。そうしないと、致命的なエラーが発生します。
function should_return_nothing(): void {
return null; // Fatal error: A void function must not return a value
}
ただし、returnを使用して関数を終了すると有効です。
function returns_nothing(): void {
return; // valid
}
null不可タイプのヒント
パラメーター
Nullable型のヒントは?
PHP 7.1で追加されました?
型ヒントの前の演算子。
function f(?string $a) {}
function g(string $a) {}
f(null); // valid
g(null); // TypeError: Argument 1 passed to g() must be of the type string, null given
PHP 7.1以前では、パラメータに型ヒントがある場合、null値を受け入れるためにはデフォルト値null
を宣言する必要があります。
function f(string $a = null) {}
function g(string $a) {}
f(null); // valid
g(null); // TypeError: Argument 1 passed to g() must be of the type string, null given
戻り値
PHP 7.0では、戻り値の型を持つ関数はnullを返さないでください。
PHP 7.1では、関数はnull可能な戻り型ヒントを宣言することができます。ただし、関数は空ではなくヌルを返す必要があります(空文字/空の戻り文)。
function f() : ?string {
return null;
}
function g() : ?string {}
function h() : ?string {}
f(); // OK
g(); // TypeError: Return value of g() must be of the type string or null, none returned
h(); // TypeError: Return value of h() must be of the type string or null, none returned