php 5 부터 함수파라미터에서 = null 을 사용할수 있는데요

php 7.1에서 nullable 문법인 ?가 추가되서

function foo ( T1 $a , T2 ?$b , T3 $c ) { } 이렇게 됩니다.

php 9에서 = null 을 삭제하고 ?$var 문법(명시적 nullable)만 남긴다고 하네요.

 

-------- 변경 이유-------

하위 클래스가 상위 클래스와 정확히 동일한 유형 서명을 갖고 있지만 기본값이 다른 경우 LSP 위반 오류가 발생한다는 것은 다소 혼란스럽습니다.

여러가지로 입증된 바와 같이 이 "기능"을 지원하는 것은

사용자 코드영역에 혼란을 일으킬 뿐만 아니라 엣지 케이스를 처리해야 하는 PHP엔진 내에서 버그 및 불필요한 복잡성의 원인이기도 합니다 (예: 암시적으로 null 허용 교차 유형을 DNF 유형으로 승격).

 

PHP 5의 기본 타입 시스템의 제한 사항을 해결하기 위해 암시적 null 이 추가되었습니다.

7.1 부터는 이러한 제한이 더 이상 존재하지 않으므로 이 기능을 사용하지 않을 것을 제안합니다.

----------------

 

https://wiki.php.net/rfc/deprecate-implicitly-nullable-types php rfc 투표 만장일치로 통과

 

 

컴포저로 패키지스트에서 PHP-CS-Fixer 를 다운받아 nullable_type_declaration_for_default_null_value 옵션을 켜면

자동으로 다 마이그레이션 해준다고

마이그레이션 이슈는 없을꺼라네요

 

 

 

  • profile

    음 제가 이해하기로는
        function foo(T $a = null)
    이렇게 일관성없는 타입 선언을 금지하겠다는 뜻으로 보입니다. 반드시 T 타입이어야 한다면서 T 타입이 아닌 null을 기본값으로 지정하는 것은 앞뒤가 맞지 않고, 꼭 null이 필요하다면 ?T 또는 T|null이라는 대체 문법이 있으니까요.

    오래 전부터 함수 파라미터의 기본값을 지정하기 위해 많이 쓰던
        function foo($a = null)
    이런 문법까지 금지하겠다는 뜻은 아닌 것 같습니다.

    XE는 타입 선언이 아예 없고, 라이믹스도 = null 문법을 대부분 기본값 지정 목적으로 사용하지, 타입 선언을 우회하거나 선택적 파라미터를 필수 파라미터보다 먼저 배치할 목적으로 사용하는 경우는 드물기 때문에, 특별히 문제가 될 것 같지는 않네요. 정 기본값을 null로 지정해야 한다면 타입을 선언하지 말아야겠지요.

  • profile ?

    말씀대로 그냥 fucntion fun ( $변수 = null) 은 되고 타입선언했을 때 = null을 막는거네요

  • profile

    함수에 파라미터 타입을 선언한 다음 =null 하지 말라는거네요.
    null 허용하려면 타입선언할 때부터 null타입허용 선언하여야 겠군요.

    strict type check 를 위해서 필요한 조치라고 생각합니다.

  • profile ?
    그렇네요 말씀감사합니다