回答:
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)かどうか。