web-dev-qa-db-ja.com

型ヒントを使用する場合、null引数を渡すことはできません

次のコード:

<?php

    class Type {

    }

    function foo(Type $t) {

    }

    foo(null);

?>

実行時に失敗しました:

PHP Fatal error:  Argument 1 passed to foo() must not be null

他の言語のようにnullを渡すことが許可されないのはなぜですか?

156
Abdullah

PHP 7.1以降(2016年12月2日リリース)

この構文を使用すると、変数を明示的にnullとして宣言できます。

function foo(?Type $t) {
}

これは結果になります

$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error

したがって、オプションの引数が必要な場合はType $t = nullの規則に従うことができますが、引数にnullとその型の両方を受け入れるようにする必要がある場合は、上記の例に従うことができます。

もっと読むことができます こちら


PHP 7.0以前

次のようなデフォルト値を追加する必要があります

function foo(Type $t = null) {

}

そのようにして、null値を渡すことができます。

これは、マニュアルの Type Declarations に関するセクションに記載されています。

パラメータのデフォルト値がNULLに設定されている場合、NULL値を受け入れるように宣言することができます。

284
DonCallisto

PHP 7.1から、 nullable types が利用可能になりました。関数と型の両方が返されるためです。タイプ?Tは、指定されたタイプT、またはnullの値を持つことができます。

したがって、関数は次のようになります。

function foo(?Type $t)
{

}

PHP 7.1で作業できるようになるとすぐに、この表記法はfunction foo(Type $t = null)よりも優先されるはずです。これは、呼び出し元がパラメーター$tの引数を明示的に指定するように強制するためです。

32
TheOperator

試してください:

function foo(Type $t = null) {

}

PHP関数の引数 を確認してください。

11
SeanWM

既に述べた他の答えとして、これはデフォルト値としてnullを指定した場合にのみ可能です。

しかし、最もクリーンなタイプセーフなオブジェクト指向ソリューションは、 NullObject

interface FooInterface
{
    function bar();
}
class Foo implements FooInterface
{
    public function bar()
    {
        return 'i am an object';
    }
}
class NullFoo implements FooInterface
{
    public function bar()
    {
        return 'i am null (but you still can use my interface)';
    }
}

使用法:

function bar_my_foo(FooInterface $foo)
{
    if ($foo instanceof NullFoo) {
        // special handling of null values may go here
    }
    echo $foo->bar();
}

bar_my_foo(new NullFoo);
4