[php] 유형 힌트를 사용할 때 null 인수를 전달할 수 없습니다

다음 코드 :

<?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 값을 전달할 수 있습니다.

이것은 유형 선언 에 대한 매뉴얼 섹션에 설명되어 있습니다 .

NULL매개 변수의 기본값이로 설정된 경우 값 을 승인하도록 선언 할 수 있습니다 NULL.


답변

PHP 7.1부터는 함수 반환 형식과 매개 변수로 nullable 형식 을 사용할 수 있습니다. 형식 ?T은 지정된 Type T또는의 값을 가질 수 있습니다 null.

따라서 함수는 다음과 같습니다.

function foo(?Type $t)
{

}

PHP 7.1로 작업 할 수있게 되 자마자이 표기법이 function foo(Type $t = null) 호출자가 매개 변수에 대한 인수를 명시 적으로 지정하도록 강제하기 때문에이$t .


답변

시험:

function foo(Type $t = null) {

}

PHP 함수 인수를 확인하십시오 .


답변

다른 답변에서 이미 언급했듯이 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);


답변