PHP7의 널 입력 가능 리턴 유형


159

PHP 7은 리턴 타입 선언을 소개 합니다. 즉, 함수 매개 변수에서 가능한 것처럼 반환 값이 특정 클래스, 인터페이스, 배열, 호출 가능 또는 새로 힌트 가능한 스칼라 유형 중 하나임을 나타낼 수 있습니다.

function returnHello(): string {
    return 'hello';
}

값이 항상 존재하지는 않으며 어떤 유형의 무언가 또는 널을 리턴 할 수도 있습니다. 기본값을 null ( DateTime $time = null) 로 설정하여 매개 변수를 널 입력 가능하게 만들 수 있지만 리턴 유형에 대해서는이를 수행 할 수있는 방법이 없습니다. 실제로 그런 경우입니까, 아니면 어떻게해야합니까? 이들은 작동하지 않습니다 :

function returnHello(): string? {
    return 'hello';
}

function returnHello(): string|null {
    return 'hello';
}

8
PHP7은 아직 널 입력 가능 리턴 유형을 허용하지 않지만, PHP 7.1에서이를 해결하기위한 RFC가 있습니다 . 예언 된 표기법은 다음과 같습니다.function returnString(?string $stringNull) : ?string { return $stringNull;}
Elias Van Ootegem

1
나는 지금까지 내 응용 프로그램에서 예외를 남용하여 nullable을 모방했습니다. 멍청한 것도 괜찮다면 github.com/JeroenDeDauw/OhMyPhp/blob/master/src/…
Jeroen De Dauw

아마도 PHP7 Trowable인터페이스 (특히 확장 TypeError) 를 사용하는 것이 더 합리적 일 것입니다.
Elias Van Ootegem

답변:


258

PHP 7.1은 이제 nullable 반환 형식을 지원합니다 . 내가 연결 한 첫 번째 RFC는 다음과 같습니다.

function nullOrString(int $foo) : ?string
{
    return $foo%2 ? "odd" : null;
}

오래된 답변 :

내 의견은 실제로 질문에 대한 답변이기 때문에 :

PHP 7은 아직 널 입력 가능 리턴 유형을 지원하지 않지만이 를 해결하기 위한 RFC 가 있으며, 이는 PHP 7.1에 착륙하는 것을 목표로합니다. 전달되면 구문은 모든 타입 힌트 (반환 타입과 타입 힌트)에 영향을 미칩니다.

public function returnStringOrNull(?array $optionalArray) : ?string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

또한 유니온 유형을 추가하기 위해 경쟁 RFC 가 있으며, 동일한 유형을 수행 할 수 있지만 다르게 보일 수 있습니다.

public function returnStringOrNull(array|null $optionalArray) : string|null
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

그러나 지금은 다음과 같이 작성해야합니다.

public function returnStringOrNull( array $optionalArray = null)
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
}

또는 반환 유형과 일치하도록 빈 문자열을 반환하고 잘못된 값을 확인하십시오.

public function returnStringOrNull( array $optionalArray = null) : string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
    return '';
}
//call
$string = $x->returnStringOrNull();
if (!$string) {
    $string = $x->returnStringOrNull(range(1, 10));
}

5
PHP 7 won't support nullable return-types just yet, but there's an RFC out to address just that예, RFC는 "아직도"입니다. 이후 난 정말 무거운 PHP 사용자를 해요 - 오해하지 마십시오 정말 엉터리 PHP3 시간은 지금 어떤 차이를 경작한다, 그러나 나는 그들이 7 거부 모든 RFC를보고, 내 느낌은 있었다 "WTF?!". 사용자는 혼란을보고 이전 버전과 호환되는 방식으로 기꺼이 정리하고 "아니오"를 얻습니다. 엉망으로 명명 된 깨끗한 방법? 고정 null도 특별 시민이되지 않는? 아니요, 필요하지 않습니다. 모든 항목을 대소 문자를 구분하도록 옵션 을 추가 하시겠습니까? 아냐. 그리고 사람들이 바뀌는 것을보고 놀랐어.
Marcin Orlowski

1
@MarcinOrlowski : nullable 반환 유형 힌트가 의미가 있습니다. 나는 7에 대한 몇 가지 RFC를 따랐으며 대부분을 거부하는 것에 동의했습니다. 그들이 중점을 둔 변경 사항은 런타임 및 컴파일러와 같은 언어에 그다지 중요하지 않았습니다. 거부 된 일부 RFC의 경우 토론 스레드를 통해 해당 변경 사항을 구현하지 않는 이유 (예 : 더 이상 사용되지 않음 var) 를 이해하는 것이 좋습니다. 한 가지 까다로운 것은 대신에 너무 많은 기쁜 것 (우주선 운영자)을
받아 들였다는 것입니다.

@EliasVanOotegem Nullable 유형은 이제 7.1이 12 월 1 일에 릴리스되었으므로 올바르게 지원됩니다.
lonesomeday

@lonesomeday : 사실, 내 대답의 맨 아래에 링크 + 기본 예제를 추가했습니다
Elias Van Ootegem

mmm ish이 답변을 업데이트하기에 좋은 유형입니다! 즉, 유니온 타입은 PHP 7.1에서 지원되지 않는 것 같습니다
Dennis

67

널 입력 가능 유형 은 PHP 7.1에서 사용 가능합니다.

다음은 구문 예입니다.

public function getName(): ?string
{
    return $this->name; // name can be null
}

PHP 7.1은 이제 GA이며 PHP 7.0에서 업그레이드 할 수 있습니다 (이전 버전과 호환되지 않는 변경 사항 은 거의 없습니다 )


22
IMO "nullable"을 구현하지 않고 반환 유형 선언을 제공하는 것은 농담입니다. "널링 가능"기능이 구현 될 때까지 리턴 유형을 사용할 수 없습니다.
joonas.fi

2
@ joonas.fi IMO 엄격하게 입력 된 반환 값은 항상 해당 유형이어야하며, null 반환은 해당 계약을 보유하지 않으며 null 값의 이유에 더 많은 의미를 부여하는 예외를 발생시켜야합니다.
Steve Buzonas

8
@SteveBuzonas Person을 나타내는 객체에서 getAgeInYears () 메소드를 고려한다면, 나이를 알려주지 않은 사람을 어떻게 모델링하겠습니까? null을 반환 하시겠습니까? 0을 반환 하시겠습니까? 의미 상 null을 의미하는 것은 "우리는 모른다"를 의미하고, 0은 의미 적으로 "사람은 0 세"를 의미합니다. 따라서 getAgeInYears () :? int가 최고의 디자인이라고 주장합니다. 예외를 던지는 예외는 예외입니다. 대부분의 시스템에서 사람의 나이를 모르는 것이 예외적 인 경우로 간주되어서는 안됩니다.
joonas.fi

@ joonas.fi는 매우 사실이며 일반적인 관행입니다. 그러나 구현시 필드가 널 입력 가능하고 이에 따라 명시 적으로 처리됨을 인식해야합니다. try / catch로 쉽게 구현 할 수있는 null경우를 제외하고 는 x를 수행하는 것이 좋습니다 . 또한 실행을 계속하기 위해 실제로 널 입력 가능 필드에 값이 필요한 경우 예외가 더 나은 옵션 일 수 있습니다.
Steve Buzonas

이 구문으로 인해 PHPMD가 많은 오류를 발생시키는 것으로 나타났습니다. 잘만되면 그들은 곧 고쳐.
Tom Jowitt

0

모든 유형에서 작동합니다.
예:

public function getOpportunity(): ?Opportunity
{
    return $this->opportunity;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.