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

PHP Core

$GLOBALS Access Restrictions

$GLOBALS 배열에 대한 액세스는 이제 여러 제한 사항이 적용됩니다. $GLOBALS['var']와 같은 개별 배열 요소에 대한 읽기 및 쓰기 액세스는 그대로 계속 작동합니다. 전체 $GLOBALS 어레이에 대한 읽기 전용 액세스도 계속 지원됩니다. 그러나 전체 $GLOBALS 배열에 대한 쓰기 액세스는 더 이상 지원되지 않습니다. 예를 들어 array_pop($GLOBALS)은 오류를 발생시킵니다.

Usage of static Variables in Inherited Methods

정적 변수를 사용하는 메서드가 상속되면(재정의되지는 않음) 상속된 메서드는 이제 부모 메서드와 정적 변수를 공유합니다.

                  
<?php
class A {
    public static function counter() {
        static $counter = 0;
        $counter++;
        return $counter;
    }
}
class B extends A {}
var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(3), previously int(1)
var_dump(B::counter()); // int(4), previously int(2)
?>
                  
                

이것은 메서드의 정적 변수가 이제 정적 속성과 동일한 방식으로 동작함을 의미합니다.

Return Type Compatibility with Internal Classes

대부분의 최종이 아닌 내부 메서드는 이제 호환 가능한 반환 유형을 선언하기 위해 재정의 메서드가 필요합니다. 그렇지 않으면 상속 유효성 검사 중에 더 이상 사용되지 않는 알림이 내보내집니다. PHP 교차 버전 호환성 문제로 인해 재정의 메서드에 대해 반환 유형을 선언할 수 없는 경우 #[ReturnTypeWillChange] 속성을 추가하여 지원 중단 알림을 묵음으로 만들 수 있습니다.

New Keywords

이제 readonly가 키워드입니다. 그러나 여전히 함수 이름으로 사용할 수 있습니다.


Resource to Object Migration

여러 resoures가 개체로 마이그레이션되었습니다. is_resource()를 사용한 반환 값 검사는 false 검사로 대체되어야 합니다.


MySQLi

mysqli_fetch_fields()mysqli_fetch_field_direct()는 이제 항상 max_length에 대해 0을 반환합니다. 이 정보는 결과 집합을 반복하고 최대 길이를 취하여 계산할 수 있습니다. 이것은 PHP가 이전에 내부적으로 하던 일입니다.

MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH 옵션은 더 이상 효과가 없습니다.

MYSQLI_STORE_RESULT_COPY_DATA 옵션은 더 이상 효과가 없습니다. mysqli::store_result()mode 매개변수에 값을 전달해도 더 이상 효과가 없습니다.

mysqli::connect()는 이제 성공 시 null 대신 true를 반환합니다.

기본 오류 처리 모드가 "자동"에서 "예외"로 변경되었습니다. 이에 수반되는 내용과 이 속성을 명시적으로 설정하는 방법에 대한 자세한 내용은 MySQLi reporting mode 페이지를 참조하십시오. 이전 동작을 복원하려면 다음을 사용하십시오. mysqli_report(MYSQLI_REPORT_OFF);

mysqli_stmt::execute()를 확장하는 클래스는 이제 추가 필수 매개변수를 지정하는 데 필요합니다.


MySQLnd

mysqlnd.fetch_data_copy INI 지시문이 제거되었습니다. 이로 인해 사용자가 볼 수 있는 동작이 변경되어서는 안 됩니다.


OpenSSL

EC 개인 키는 이제 다른 모든 키와 마찬가지로 기존 형식이 아닌 PKCS#8 형식으로 내보내집니다.

openssl_pkcs7_encrypt()openssl_cms_encrypt()는 이제 RC2-40이 아닌 AES-128-CBC를 사용하여 기본값으로 설정됩니다. RC2-40 암호는 안전하지 않은 것으로 간주되며 OpenSSL 3에서 기본적으로 활성화되지 않습니다.


PHP Data Objects

PDO::ATTR_STRINGIFY_FETCHES는 이제 bool 유형의 값을 "0" 또는 "1"로 문자열화합니다. 이전에는 bool이 문자열화되지 않았습니다.

PDO::PARAM_LOB와 함께 PDOStatement::bindColumn()을 호출하면 이제 PDO::ATTR_STRINGIFY_FETCHES가 활성화되지 않은 경우 스트림 결과를 지속적으로 바인딩합니다. 이전에는 사용된 데이터베이스 드라이버와 바인딩이 수행된 시간에 따라 결과가 스트림 또는 문자열이었습니다.

MySQL Driver

에뮬레이트된 준비된 명령문을 사용할 때 결과 세트의 정수 및 부동 소수점은 이제 문자열 대신 기본 PHP 유형을 사용하여 반환됩니다. 이것은 기본 준비된 문의 동작과 일치합니다. PDO::ATTR_STRINGIFY_FETCHES 옵션을 활성화하면 이전 동작을 복원할 수 있습니다.

SQLite Driver

결과 세트의 정수 및 부동 소수점은 이제 기본 PHP 유형을 사용하여 반환됩니다. PDO::ATTR_STRINGIFY_FETCHES 옵션을 활성화하면 이전 동작을 복원할 수 있습니다.


Phar

ArrayAccess 인터페이스를 준수하기 위해 Phar::offsetUnset()PharData::offsetUnset()은 더 이상 bool을 반환하지 않습니다.


Standard

version_compare()는 더 이상 문서화되지 않은 연산자 약어를 허용하지 않습니다.

htmlspecialchars(), htmlentities(), htmlspecialchars_decode(), html_entity_decode()get_html_translation_table()은 이제 기본적으로 ENT_COMPAT가 아닌 ENT_QUOTES | ENT_SUBSTITUTE입니다. 이는 이전에 아무 작업도 수행되지 않은 상태에서 '이(가) &#039;로 이스케이프되었음을 의미합니다. 또한 형식이 잘못된 UTF-8은 빈 문자열이 아닌 유니코드 대체 문자로 대체됩니다.

debug_zval_dump()는 이제 값 앞에 &만 추가하는 대신 참조 래퍼의 참조 횟수를 참조 횟수와 함께 인쇄합니다. 이것은 PHP 7.0부터 참조 표현을 보다 정확하게 모델링합니다.

debug_zval_dump()는 이제 interned 문자열과 불변 배열에 대한 더미 참조 카운트 대신 interned을 인쇄합니다.


Standard PHP Library (SPL)

SplFixedArray는 이제 배열처럼 JSON으로 인코딩됩니다.