형식 힌트를 사용할 때 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 가능한 유형을 사용할 수 있습니다.종류?T지정된 유형의 값을 가질 수 있습니다.T, 또는null.

따라서 기능은 다음과 같습니다.

function foo(?Type $t) {
} 

PHP 7.1로 작업할 수 있게 되면 이 표기법이 우선됩니다.function foo(Type $t = null)이는 발신자가 파라미터 인수를 명시적으로 지정하도록 강제하기 때문입니다.$t.




시험:

function foo(Type $t = null) {
} 

PHP 함수 인수를 확인합니다.




이미 언급되어 있는 다른 답변과 같이, 이것은 다음 조건을 지정한 경우에만 가능합니다.null디폴트값으로 설정합니다.

그러나 가장 깨끗한 타입 세이프 객체 지향 솔루션은 Null Object입니다.

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); 



PHP 8.0(2020년 11월 26일 출시)부터는 null 가능한 union 유형도 사용할 수 있습니다.

즉, 어느 쪽이든 합격할 수 있습니다.Type또는null파라미터 값으로 지정합니다.

function foo(Type null $param) {
var_dump($param); }
foo(new Type()); // ok : object(Type)#1 foo(null);
// ok : NULL 

유니언 타입에 대한 자세한 내용은 이쪽.