サーチ…


構文

  • 関数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は、 RequiredTypeProvidedTypeの型でなければなりません

ヒンティングスカラー型、配列、呼び出し可能型

タイプヒント配列パラメータ(および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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow