PHP7.3 이전 버전과 호환되지 않는 변경 사항

PHP Core

Heredoc/Nowdoc Ending Label Interpretation

유연한 heredoc/nowdoc 구문의 도입으로 인해 본문 안에 끝 레이블이 포함된 문서 문자열은 구문 오류나 해석 변경을 일으킬 수 있습니다. 예:

                  
<?php
$str = <<<FOO
abcdefg
   FOO
FOO;
?>
                  
                

FOO의 들여쓰기된 발생은 이전에 특별한 의미가 없었습니다. 이제 heredoc 문자열과 다음 FOO의 끝으로 해석됩니다. 구문 오류가 발생합니다. 이 문제는 문자열 내용 내에서 발생하지 않는 종료 레이블을 선택하여 항상 해결할 수 있습니다.

Continue Targeting Switch issues Warning

스위치 제어 흐름 구조를 대상으로 하는 계속 문은 이제 경고를 생성합니다. PHP에서 이러한 continue 문은 break와 동일하지만 다른 언어에서는 계속 2로 동작합니다.

                  
<?php
while ($foo) {
    switch ($bar) {
      case "baz":
         continue;
         // Warning: "continue" targeting switch is equivalent to
         //          "break". Did you mean to use "continue 2"?
   }
}
?>
                  
                

Strict Interpretation of Integer String Keys on ArrayAccess

$obj가 ArrayAccess를 구현하고 "123"이 정수 문자열 리터럴인 $obj["123"] 유형의 배열 액세스는 더 이상 정수로의 암시적 변환을 초래하지 않습니다. 즉, $obj->offsetGet("123")은 $obj->offsetGet(123) 대신 호출됩니다. 이것은 비 리터럴에 대한 기존 동작과 일치합니다. 배열의 동작은 어떤 식으로든 영향을 받지 않으며, 정수 문자열 키를 암시적으로 계속해서 정수로 변환합니다.

Static Properties no longer separated by Reference Assignment

PHP에서 정적 속성은 자식 클래스에서 명시적으로 재정의되지 않는 한 상속하는 클래스 간에 공유됩니다. 그러나 구현 아티팩트로 인해 참조를 할당하여 정적 속성을 분리할 수 있었습니다. 이 허점이 수정되었습니다.

                  
<?php
class Test {
    public static $x = 0;
}
class Test2 extends Test { }

Test2::$x = &$x;
$x = 1;

var_dump(Test::$x, Test2::$x);
// Previously: int(0), int(1)
// Now:        int(1), int(1)
?>
                  
                

References returned by Array and Property Accesses are immediately unwrapped

배열 및 속성 액세스에서 반환된 참조는 이제 액세스의 일부로 래핑 해제됩니다. 이것은 액세스와 액세스된 값의 사용 사이의 참조를 더 이상 수정할 수 없음을 의미합니다.

                  
<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Previously: int(4), Now: int(3)
?>
                  
                

이렇게 하면 참조 및 비참조의 동작이 일관됩니다. 단일 표현식 내에서 값을 읽고 쓰는 것은 정의되지 않은 동작으로 남아 있으며 나중에 다시 변경될 수 있습니다.

Argument Unpacking of Traversables with non-Integer Keys no longer supported

정수가 아닌 키가 있는 Traversable에서 인수 압축 해제 작업이 중지되었습니다. 다음 코드는 PHP 5.6-7.2에서 우연히 작동했습니다.

                  
<?php
function foo(...$args) {
    var_dump($args);
}
function gen() {
    yield 1.23 => 123;
}
foo(...gen());
?>
                  
                

Miscellaneous

ext_skel 유틸리티는 새로운 옵션과 일부 이전 옵션이 제거되어 완전히 재설계되었습니다. 이것은 이제 PHP로 작성되었으며 외부 종속성이 없습니다.

BeOS에 대한 지원이 중단되었습니다.

EH_THROW 모드에서 경고를 예외로 자동 변환하여 발생한 예외(예: 일부 DateTime 예외)는 더 이상 error_get_last() 상태를 채우지 않습니다. 따라서 이제 수동으로 throw된 예외와 동일한 방식으로 작동합니다.

TypeError는 이제 각각 정수 및 부울 대신에 잘못된 유형을 int 및 bool로 보고합니다.

Compact()에 전달된 정의되지 않은 변수는 이제 알림으로 보고됩니다.

getimagesize() 및 관련 함수는 이제 BMP 이미지의 MIME 유형을 image/x-ms-bmp 대신 image/bmp로 보고합니다. 전자가 IANA에 등록되었기 때문입니다(» RFC 7903 참조).

stream_socket_get_name()은 이제 대괄호로 묶인 IPv6 주소를 반환합니다. 예를 들어 "::1:1337" 대신 "[::1]:1337"이 반환됩니다.


BCMath Arbitrary Precision Mathematics

BCMath 함수에서 발생하는 모든 경고는 이제 PHP의 오류 처리를 사용합니다. 이전에는 일부 경고가 stderr에 직접 작성되었습니다.

bcmul()bcpow()는 이제 요청된 배율로 숫자를 반환합니다. 이전에는 반환된 숫자에 후행 10진수 0이 생략되었을 수 있습니다.


IMAP, POP3 and NNTP

rsh/ssh 로그인은 기본적으로 비활성화되어 있습니다. 활성화하려면 imap.enable_insecure_rsh를 사용하십시오. IMAP 라이브러리는 사서함 이름을 rsh/ssh 명령에 전달하기 전에 필터링하지 않으므로 rsh/ssh가 활성화된 상태에서 이 함수에 신뢰할 수 없는 데이터를 전달하는 것은 안전하지 않습니다.


Multibyte String

명명된 캡처에 대한 추가 지원으로 인해 명명된 캡처를 사용하는 mb_ereg_*() 패턴이 다르게 작동합니다. 특히 명명된 캡처는 일치의 일부가 되고 mb_ereg_replace()는 추가 구문을 해석합니다. 자세한 내용은 명명된 캡처를 참조하십시오.


MySQL Improved Extension

준비된 명령문은 이제 소수 지정자를 사용하여 DATETIME, TIME 및 TIMESTAMP 열에 대한 소수 자릿수 초를 올바르게 보고합니다(예: 마이크로초를 사용할 때 TIMESTAMP(6)). 이전에는 소수 초 부분이 반환된 값에서 단순히 생략되었습니다.


MySQL Functions (PDO_MYSQL)

준비된 명령문은 이제 소수 지정자를 사용하여 DATETIME, TIME 및 TIMESTAMP 열에 대한 소수 자릿수 초를 올바르게 보고합니다(예: 마이크로초를 사용할 때 TIMESTAMP(6)). 이전에는 소수 초 부분이 반환된 값에서 단순히 생략되었습니다. 이것은 에뮬레이트된 준비가 꺼져 있는 PDO_MYSQL 사용에만 영향을 미칩니다(예: 기본 준비 기능 사용). PDO::ATTR_EMULATE_PREPARES=true(기본값)를 갖는 연결을 사용하는 문은 수정된 버그의 영향을 받지 않았으며 이미 엔진에서 적절한 소수 초 값을 가져왔습니다.


Reflection

문자열로의 Reflection 내보내기는 이제 정수 및 부울 대신 각각 int 및 bool을 사용합니다.


Standard PHP Library (SPL)

SPL 오토로더에서 예외가 발생하면 다음 오토로더가 실행되지 않습니다. 이전에는 모든 자동 로더가 실행되었고 예외가 연결되었습니다.


SimpleXML

SimpleXML 객체와 관련된 수학 연산은 이제 텍스트를 int 또는 float 중 더 적절한 것으로 처리합니다. 이전에는 값이 무조건 int로 처리되었습니다.


Incoming Cookies

PHP 7.3.23부터 보안상의 이유로 들어오는 쿠키의 이름이 더 이상 URL 디코딩되지 않습니다.