回答:
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いる場合は、値を受け入れるように宣言できます。
function foo(Type $t)は、nullを渡すことができないという事実は非常に良いことです。Null References:The Billion Dollar Mistake
他の回答がすでに述べたように、これは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);
NullFoo(の定義ではnull)意味がない場合でも、の作成者は抽象メソッドをオーバーライドする必要があります。
if (something is null)NullObjectは存在しない値のすべての動作をカバーすることを目的としているため、NullObjectパターンは少し乱用されています。外部のコラボレーターは、オブジェクトが存在しない(null)かどうか。