次のコード:
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の値を持つことができます。Tnull
したがって、関数は次のようになります。
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);