형식 힌트를 사용할 때 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) {
}
이미 언급되어 있는 다른 답변과 같이, 이것은 다음 조건을 지정한 경우에만 가능합니다.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
'programing' 카테고리의 다른 글
JavaScript에서 어레이의 선두에 새로운 어레이 요소를 추가하려면 어떻게 해야 합니까? (0) | 2022.10.01 |
---|---|
ES6 모듈을 조건부로 Import하려면 어떻게 해야 하나요? (0) | 2022.10.01 |
좋은 욕설 필터는 어떻게 구현합니까? (0) | 2022.10.01 |
DBForge를 통해 MariaDB column_list 결과 보기 (0) | 2022.10.01 |
jQuery를 사용하여 테이블 행을 삭제하는 가장 좋은 방법은 무엇입니까? (0) | 2022.10.01 |