次のコード:
<?php
class Type {
}
function foo(Type $t) {
}
foo(null);
?>
実行時に失敗しました:
PHP Fatal error: Argument 1 passed to foo() must not be null
他の言語のようにnullを渡すことが許可されないのはなぜですか?
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
値を受け入れるように宣言することができます。
PHP 7.1から、 nullable types が利用可能になりました。関数と型の両方が返されるためです。タイプ?T
は、指定されたタイプT
、またはnull
の値を持つことができます。
したがって、関数は次のようになります。
function foo(?Type $t)
{
}
PHP 7.1で作業できるようになるとすぐに、この表記法はfunction foo(Type $t = null)
よりも優先されるはずです。これは、呼び出し元がパラメーター$t
の引数を明示的に指定するように強制するためです。
既に述べた他の答えとして、これはデフォルト値として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);