programing

형식 힌트를 사용할 때 null 인수를 전달할 수 없습니다.

kingscode 2022. 10. 1. 21:06
반응형

형식 힌트를 사용할 때 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일 출시)부터는 무효 조합 유형도 사용할 수 있습니다.

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

function foo(Type|null $param) {
    var_dump($param);
}

foo(new Type()); // ok : object(Type)#1
foo(null);       // ok : NULL

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

제 경우 null을 사용할 수 없는 네이티브 "trim" 함수가 문제였습니다.예를 들어 다음과 같은 코드가 있다고 가정합니다.

if (trim($tables) != '') 
{
 //code 
} 

PHP8은 이 에러를 발생시키기도 합니다.따라서 이 에러와 같은 커스텀 「트림」함수를 작성하면 동작합니다.

  public function custom_trim(?string $value)
  {
    return trim($value ?? '') ;
  } 

7.4에서 8로의 변경은 정말 싫다.

언급URL : https://stackoverflow.com/questions/14584145/cannot-pass-null-argument-when-using-type-hinting

반응형