218

次のコード:

class Type {

}

function foo(Type $t) {

}

foo(null);

実行時に失敗しました:

PHP 致命的なエラー: foo() に渡される引数 1 は null であってはなりません

他の言語と同じように null を渡せないのはなぜですか?

4

5 に答える 5

411

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 値を渡すことができます。

これは、タイプ宣言に関するマニュアルのセクションに記載されています。

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

于 2013-01-29T13:34:31.110 に答える
36

PHP 7.1 から、関数の戻り値の型とパラメーターの両方として、 null 許容型が利用可能になりました。タイプは、指定された Typeまたは?Tの値を持つことができます。Tnull

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

function foo(?Type $t)
{

}

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

于 2016-11-09T08:55:05.210 に答える
13

試す:

function foo(Type $t = null) {

}

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

于 2013-01-29T13:33:42.650 に答える
6

他の回答が既に述べたように、これは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);
于 2013-01-29T13:43:34.910 に答える