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

PHP Core

Array-style access of non-arrays

null, bool, int, float 또는 리소스 유형의 값을 배열(예: $null["key"])로 사용하려고 하면 이제 알림이 생성됩니다.

get_declared_classes() function

get_declared_classes() 함수는 아직 인스턴스화되지 않은 익명 클래스를 더 이상 반환하지 않습니다.

fn keyword

fn은 이제 예약된 키워드입니다. 특히 더 이상 함수나 클래스 이름으로 사용할 수 없습니다. 여전히 메서드 또는 클래스 상수 이름으로 사용할 수 있습니다.

<?php tag at end of file

파일 끝에 있는 <?(뒤에 개행 없음)는 이제 여는 PHP 태그로 해석됩니다. 이전에는 리터럴 php가 뒤따르는 짧은 여는 태그로 해석되어 구문 오류(short_open_tag=1 사용)가 발생하거나 리터럴 <? 문자열(short_open_tag=0 사용)로 해석되었습니다.

Stream wrappers

스트림에서 포함/요구를 사용할 때 streamWrapper::stream_set_option()은 STREAM_OPTION_READ_BUFFER 옵션과 함께 호출됩니다. 사용자 정의 스트림 래퍼 구현은 경고를 피하기 위해 streamWrapper::stream_set_option() 메서드를 구현해야 할 수도 있습니다(항상 false를 반환하는 것으로 충분함).

Serialization

o 직렬화 형식이 제거되었습니다. PHP에서 생성되지 않으므로 수동으로 제작된 문자열의 직렬화 해제만 중단될 수 있습니다.

Password algorithm constants

암호 해싱 알고리즘 식별자는 이제 정수가 아닌 nullable 문자열입니다.

  • PASSWORD_DEFAULT was int 1; now is null
  • PASSWORD_BCRYPT was int 1; now is string '2y'
  • PASSWORD_ARGON2I was int 2; now is string 'argon2i'
  • PASSWORD_ARGON2ID was int 3; now is string 'argon2id'

PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2I 및 PASSWORD_ARGON2ID 상수를 올바르게 사용하는 응용 프로그램은 계속해서 올바르게 작동합니다.

htmlentities() function

htmlentities()는 기본 엔터티 대체만 지원되는 인코딩과 함께 사용되는 경우 (엄격한 표준 경고 대신) 알림을 발생시킵니다. 이 경우 htmlspecialchars()와 동일합니다.

fread() and fwrite() function

fread()fwrite()는 이제 작업이 실패하면 false를 반환합니다. 이전에는 빈 문자열 또는 0이 반환되었습니다. EAGAIN/EWOULDBLOCK은 실패로 간주되지 않습니다.

이러한 함수는 이제 읽기 전용 파일 리소스에 쓰려고 할 때와 같이 실패 시 알림을 표시합니다.


BCMath Arbitrary Precision Mathematics

BCMath 함수는 이제 "32foo"와 같이 형식이 잘못된 숫자가 전달되면 경고합니다. 인수는 이전과 같이 0으로 해석됩니다.


CURL

이제 CURLFile 클래스를 직렬화하려고 하면 예외가 생성됩니다. 이전에는 직렬화 해제 시에만 예외가 발생했습니다.

CURLPIPE_HTTP1 사용은 더 이상 사용되지 않으며 cURL 7.62.0부터 더 이상 지원되지 않습니다.

curl_version()의 $version 매개변수는 더 이상 사용되지 않습니다. 기본 CURLVERSION_NOW와 같지 않은 값이 전달되면 경고가 발생하고 매개변수는 무시됩니다.


날짜와 시간

DateTime 또는 DateTimeImmutable 인스턴스에서 var_dump() 또는 이와 유사한 호출은 더 이상 개체에 액세스 가능한 속성을 남기지 않습니다.

DateInterval 개체의 비교(==, < 등 사용)는 이제 경고를 생성하고 항상 false를 반환합니다. 이전에는 속성이 없는 한 모든 DateInterval 개체가 동일한 것으로 간주되었습니다.


Intl

idn_to_ascii()idn_to_utf8()의 기본 매개변수 값은 이제 더 이상 사용되지 않는 INTL_IDNA_VARIANT_2003 대신 INTL_IDNA_VARIANT_UTS46입니다.


MySQLi

내장 서버 기능이 제거되었습니다. PHP 7.0 이상부터 깨졌습니다.

문서화되지 않은 mysqli::$stat 속성은 mysqli::stat() 대신 제거되었습니다.


OpenSSL

openssl_random_pseudo_bytes() 함수는 이제 random_bytes()와 유사한 오류 상황에서 예외를 throw합니다. 특히 요청된 바이트 수가 0보다 작거나 같으면 오류가 발생하고 충분한 임의성을 수집할 수 없으면 예외가 발생합니다. $crypto_strong 출력 인수는 함수가 throw하지 않으면 항상 true로 보장되므로 명시적으로 확인할 필요가 없습니다.


Regular Expressions (Perl-Compatible)

PREG_UNMATCHED_AS_NULL 모드가 사용될 때, 일치하지 않는 후행 캡처링 그룹도 이제 null로 설정됩니다(또는 오프셋 캡처가 활성화된 경우 [null, -1]). 이것은 $matches의 크기가 항상 동일하다는 것을 의미합니다.


PHP Data Objects

PDO 또는 PDOStatement 인스턴스를 직렬화하려고 하면 직렬화를 지원하지 않는 다른 내부 클래스와 일치하는 PDOException이 아닌 예외가 생성됩니다.


Reflection

리플렉션 객체는 직렬화를 시도하면 예외를 생성합니다. 리플렉션 객체에 대한 직렬화는 지원되지 않았으며 결과적으로 리플렉션 객체가 손상되었습니다. 지금은 명시적으로 금지되어 있습니다.

ReflectionClassConstant, ReflectionMethodReflectionProperty의 클래스 상수 값이 변경되었습니다.


Standard PHP Library (SPL)

ArrayObject 인스턴스에서 get_object_vars()를 호출하면 이제 항상 ArrayObject 자체(또는 하위 클래스)의 속성을 반환합니다. 이전에는 ArrayObject::STD_PROP_LIST 플래그가 지정되지 않은 경우 래핑된 배열/객체의 값을 반환했습니다.

영향을 받는 다른 작업은 다음과 같습니다.

  • ReflectionObject::getProperties()
  • reset(), current() 등 대신 Iterator 메서드를 사용하십시오.
  • 객체 속성을 목록으로 작업하는 잠재적인 다른 것, 예: array_walk().

(배열) 캐스트는 영향을 받지 않습니다. ArrayObject::STD_PROP_LIST 플래그가 사용되는지 여부에 따라 계속해서 래핑된 배열이나 ArrayObject 속성을 반환합니다.

SplPriorityQueue::setExtractFlags()는 0이 전달되면 예외를 throw합니다. 이전에는 다음 추출 작업에서 복구 가능한 치명적인 오류가 생성되었습니다.

ArrayObject, ArrayIterator, SplDoublyLinkedListSplObjectStorage는 이제 Serializable 인터페이스 외에도 __serialize() 및 __unserialize() 메커니즘을 지원합니다. 즉, 이전 PHP 버전에서 생성된 직렬화 페이로드는 여전히 직렬화 해제될 수 있지만 PHP 7.4에서 생성된 새 페이로드는 이전 버전에서 이해할 수 없습니다.


Tokenizer

token_get_all()은 이제 토큰 스트림에 구멍을 남기지 않고 예기치 않은 문자에 대해 T_BAD_CHARACTER 토큰을 방출합니다.


Incoming Cookies

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