次のコード:
class Type {
}
function foo(Type $t) {
}
foo(null);
実行時に失敗しました:
PHP 致命的なエラー: foo() に渡される引数 1 は null であってはなりません
他の言語と同じように null を渡せないのはなぜですか?
次のコード:
class Type {
}
function foo(Type $t) {
}
foo(null);
実行時に失敗しました:
PHP 致命的なエラー: foo() に渡される引数 1 は 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 値を渡すことができます。
これは、タイプ宣言に関するマニュアルのセクションに記載されています。
NULL
パラメータのデフォルト値が に設定されている場合、値を受け入れるように宣言を行うことができますNULL
。
PHP 7.1 から、関数の戻り値の型とパラメーターの両方として、 null 許容型が利用可能になりました。タイプは、指定された Typeまたは?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);