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

PHP Core

문자열 대 숫자 비교

숫자와 숫자가 아닌 문자열 간의 엄격하지 않은 비교는 이제 숫자를 문자열로 캐스팅하고 문자열을 비교하여 작동합니다. 숫자와 숫자 문자열 간의 비교는 이전과 같이 계속 작동합니다. 특히 이것은 0 == "not-a-number"가 이제 false로 간주된다는 것을 의미합니다.

Comparison Before After
0 == "0" true true
0 == "0.0" true true
0 == "foo" true false
0 == "" true false
42 == " 42" true true
42 == "42foo" true false

기타 호환되지 않는 변경 사항

  • match는 이제 예약된 키워드입니다.
  • 이제 기본적으로 어설션 실패가 발생합니다. 이전 동작을 원하는 경우 INI 설정에서 assert.exception=0을 설정할 수 있습니다.
  • 클래스와 이름이 같은 메서드는 더 이상 생성자로 해석되지 않습니다. 대신 __construct() 메서드를 사용해야 합니다.
  • 비정적 메서드를 정적으로 호출하는 기능이 제거되었습니다. 따라서 is_callable()은 클래스 이름이 있는 비정적 메서드를 확인할 때 실패합니다(객체 인스턴스로 확인해야 함).
  • (real)(unset) 캐스트가 제거되었습니다.
  • track_errors ini 지시문이 제거되었습니다. 이것은 php_errormsg를 더 이상 사용할 수 없음을 의미합니다. error_get_last() 함수를 대신 사용할 수 있습니다.
  • 대소문자를 구분하지 않는 상수를 정의하는 기능이 제거되었습니다. define()에 대한 세 번째 인수는 더 이상 true가 아닐 수 있습니다.
  • __autoload() 함수를 사용하여 자동 로더를 지정하는 기능이 제거되었습니다. 대신 spl_autoload_register()를 사용해야 합니다.
  • errcontext 인수는 더 이상 set_error_handler()로 설정된 사용자 정의 오류 처리기에 전달되지 않습니다.
  • create_function()이 제거되었습니다. 대신 익명 함수를 사용할 수 있습니다.
  • each()가 제거되었습니다. 대신 foreach 또는 ArrayIterator를 사용해야 합니다.
  • Closure::fromCallable() 또는 ReflectionMethod::getClosure()를 사용하여 메서드에서 생성된 클로저에서 this를 바인딩 해제하는 기능이 제거되었습니다.
  • this 사용을 포함하는 적절한 클로저에서 this를 바인딩 해제하는 기능도 제거되었습니다.
  • 객체와 함께 array_key_exists()를 사용하는 기능이 제거되었습니다. 대신 isset() 또는 property_exists()를 사용할 수 있습니다.
  • 키 매개변수의 유형과 관련된 array_key_exists()의 동작은 isset() 및 일반 배열 액세스와 일치하도록 만들어졌습니다. 모든 키 유형은 이제 일반적인 강제 변환을 사용하고 배열/객체 키는 TypeError를 발생시킵니다.
  • 첫 번째 숫자 키로 숫자 n이 있는 모든 배열은 n이 음수인 경우에도 다음 암시적 키에 n+1을 사용합니다.
  • 기본 error_reporting 수준은 이제 E_ALL입니다. 이전에는 E_NOTICEE_DEPRECATED를 제외했습니다.
  • display_startup_errors는 이제 기본적으로 활성화됩니다.
  • 부모가 없는 클래스 내에서 parent를 사용하면 이제 치명적인 컴파일 시간 오류가 발생합니다.
  • @ 연산자는 더 이상 치명적인 오류(E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE)를 침묵시키지 않습니다. @가 사용될 때 error_reporting이 0이 될 것으로 예상하는 오류 처리기는 대신 마스크 검사를 사용하도록 조정되어야 합니다.
                          
    <?php
    // Replace
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
        if (error_reporting() == 0) {
            return false; // Silenced
        }
        // ...
    }
    
    // With
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
        if (!(error_reporting() & $err_no)) {
            return false; // Silenced
        }
        // ...
    }
    ?>
                          
                        

    또한 프로덕션 환경에서는 오류 메시지가 표시되지 않으므로 정보 누출이 발생할 수 있으므로 주의해야 합니다. display_errors=Off가 오류 로깅과 함께 사용되었는지 확인하십시오.

  • 이 구문이 이제 속성에 사용되기 때문에 #[은 더 이상 주석의 시작으로 해석되지 않습니다.
  • 호환되지 않는 메서드 서명(LSP 위반)으로 인한 상속 오류는 이제 항상 치명적인 오류를 생성합니다. 이전에는 일부 경우에 경고가 생성되었습니다.
  • 연결 연산자의 우선 순위는 비트 시프트, 더하기 및 빼기와 관련하여 변경되었습니다.
                          
    <?php
    echo "Sum: " . $a + $b;
    // was previously interpreted as:
    echo ("Sum: " . $a) + $b;
    // is now interpreted as:
    echo "Sum:" . ($a + $b);
    ?>
                          
                        
  • 런타임에 null로 확인되는 기본값이 있는 인수는 더 이상 암시적으로 인수 유형을 nullable로 표시하지 않습니다. 명시적 null 허용 유형 또는 명시적 null 기본값을 대신 사용해야 합니다.
                          
    <?php
    // Replace
    function test(int $arg = CONST_RESOLVING_TO_NULL) {}
    // With
    function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
    // Or
    function test(int $arg = null) {}
    ?>
                          
                        
  • 여러 경고가 오류 예외로 변환되었습니다.
    • 객체가 아닌 속성에 쓰려고 합니다. 이전에는 null, false 및 빈 문자열에 대한 stdClass 개체를 암시적으로 만들었습니다.
    • PHP_INT_MAX 키가 이미 사용된 배열에 요소를 추가하려고 합니다.
    • 잘못된 유형(배열 또는 개체)을 배열 키 또는 문자열 오프셋으로 사용하려고 합니다.
    • 스칼라 값의 배열 인덱스에 쓰려고 합니다.
    • non-array/Traversable의 압축을 풀려고 합니다.
    • 정의되지 않은 규정되지 않은 상수에 액세스하려고 시도합니다. 이전에는 규정되지 않은 상수 액세스로 인해 경고가 발생하고 문자열로 해석되었습니다.

    많은 알림이 경고로 전환되었습니다.

    • Attempting to read an undefined variable.
    • Attempting to read an undefined property.
    • Attempting to read an undefined array key.
    • Attempting to read a property of a non-object.
    • Attempting to access an array index of a non-array.
    • Attempting to convert an array to string.
    • nAttempting to use a resource as an array key.
    • Attempting to use null, a boolean, or a float as a string offset.
    • Attempting to read an out-of-bounds string offset.
    • Attempting to assign an empty string to a string offset.
  • 문자열 오프셋에 여러 바이트를 할당하려고 하면 이제 경고가 발생합니다.
  • 소스 파일의 예기치 않은 문자(예: 문자열 외부의 NUL 바이트)는 이제 컴파일 경고 대신 ParseError 예외를 발생시킵니다.
  • 잡히지 않은 예외는 이제 "완벽한 종료"를 거칩니다. 즉, 잡히지 않은 예외 후에 소멸자가 호출됩니다.
  • 컴파일 시 치명적인 오류 "변수만 참조로 전달할 수 있음"이 런타임까지 지연되었으며 "인수를 참조로 전달할 수 없음" 오류 예외로 변환되었습니다.
  • 일부 "변수만 참조로 전달되어야 함" 알림이 "인수는 참조로 전달할 수 없음" 예외로 변환되었습니다.
  • 익명 클래스에 대해 생성된 이름이 변경되었습니다. 이제 첫 번째 부모 또는 인터페이스의 이름이 포함됩니다.
                          
    <?php
    new class extends ParentClass {};
    // -> ParentClass@anonymous
    new class implements FirstInterface, SecondInterface {};
    // -> FirstInterface@anonymous
    new class {};
    // -> class@anonymous
    ?>
                          
                        

    위에 표시된 이름 뒤에는 여전히 NUL 바이트와 고유 접미사가 있습니다.

  • 특성 별칭 적응에서 절대적이지 않은 특성 메서드 참조는 이제 명확해야 합니다.
                          
    <?php
    class X {
        use T1, T2 {
            func as otherFunc;
        }
        function func() {}
    }
    ?>
                          
                        

    T1::func()T2::func()가 모두 존재하는 경우 이 코드는 이전에 자동으로 수락되었으며 func는 T1::func()를 참조하는 것으로 가정되었습니다. 이제 치명적인 오류가 대신 생성되며 T1::func() 또는 T2::func()를 명시적으로 작성해야 합니다.

  • 특성에 정의된 추상 메서드의 서명은 이제 구현 클래스 메서드에 대해 확인됩니다.
                          
    <?php
    trait MyTrait {
        abstract private function neededByTrait(): string;
    }
    
    class MyClass {
        use MyTrait;
    
        // Error, because of return type mismatch.
        private function neededByTrait(): int { return 42; }
    }
    ?>
                          
                        
  • 비활성화된 함수는 이제 존재하지 않는 함수와 똑같이 처리됩니다. 비활성화된 함수를 호출하면 알 수 없는 것으로 보고되고 비활성화된 함수를 재정의하는 것이 이제 가능합니다.
  • data:// 스트림 래퍼는 더 이상 쓸 수 없으며 이는 문서화된 동작과 일치합니다.
  • 산술 및 비트 연산자 +, -, *, /, **, %, <<, >>, &, |, ^, ~, ++, --는 이제 피연산자 중 하나가 배열, 리소스 또는 오버로드되지 않은 개체. 이에 대한 유일한 예외는 계속 지원되는 배열 + 배열 병합 작업입니다.
  • Float to string 캐스팅은 이제 항상 로케일에 독립적으로 작동합니다.
                          
    <?php
    setlocale(LC_ALL, "de_DE");
    $f = 3.14;
    echo $f, "\n";
    // Previously: 3,14
    // Now:        3.14
    ?>
                          
                        

    숫자 형식을 사용자 정의하는 방법은 printf(), number_format() 및 NumberFormatter()를 참조하십시오.

  • 오프셋 액세스에 대해 더 이상 사용되지 않는 중괄호에 대한 지원이 제거되었습니다.
                          
    <?php
    // Instead of:
    $array{0};
    $array{"key"};
    // Write:
    $array[0];
    $array["key"];
    ?>
                          
                        
  • private 메서드에 final 한정자를 적용하면 해당 메서드가 생성자가 아닌 경우 경고가 생성됩니다.
  • 객체 생성자가 exit()를 종료하면 객체 소멸자가 더 이상 호출되지 않습니다. 이것은 생성자가 던질 때의 동작과 일치합니다.
  • 네임스페이스 이름은 더 이상 공백을 포함할 수 없습니다. Foo\Bar는 네임스페이스 이름으로 인식되지만 Foo \ Bar는 인식되지 않습니다. 반대로 예약된 키워드는 이제 네임스페이스 세그먼트로 허용되며 코드 해석도 변경될 수 있습니다. new\x는 이제 new \x()가 아니라 constant('new\x')와 동일합니다.
  • 중첩된 삼항에는 이제 명시적 괄호가 필요합니다.
  • debug_backtrace()Exception::getTrace()는 더 이상 인수에 대한 참조를 제공하지 않습니다. 역추적을 통해 함수 인수를 변경할 수 없습니다.
  • 숫자 문자열 처리가 더 직관적이고 오류가 덜 발생하도록 변경되었습니다. 이제 선행 공백이 처리되는 방식과 일관성을 위해 숫자 문자열에서 후행 공백이 허용됩니다. 이것은 주로 다음에 영향을 미칩니다.
    • The is_numeric() function
    • String-to-string comparisons
    • Type declarations
    • Increment and decrement operations

    "선행 숫자 문자열"의 개념은 대부분 삭제되었습니다. 마이그레이션을 용이하게 하기 위해 이것이 남아 있는 경우가 있습니다. E_NOTICE "정형이 아닌 숫자 값이 발생했습니다"를 발생시킨 문자열은 이제 E_WARNING "숫자가 아닌 값이 발생했습니다"를 발생시키고 E_WARNING "숫자가 아닌 값이 발생했습니다"를 발생시킨 모든 문자열은 이제 TypeError를 발생시킵니다. 이것은 주로 다음에 영향을 미칩니다.

    • Arithmetic operations
    • Bitwise operations

    TypeError로의 이 E_WARNING 변경은 잘못된 문자열 오프셋에 대한 E_WARNING "Illegal string offset 'string'"에도 영향을 줍니다. 문자열에서 int/float로의 명시적 캐스트 동작은 변경되지 않았습니다.

  • 이제 Magic Methods는 선언된 경우 인수 및 반환 유형을 확인합니다. 서명은 다음 목록과 일치해야 합니다.
    • __call(string $name, array $arguments): mixed
    • __callStatic(string $name, array $arguments): mixed
    • __clone(): void
    • __debugInfo(): ?array
    • __get(string $name): mixed
    • __invoke(mixed $arguments): mixed
    • __isset(string $name): bool
    • __serialize(): array
    • __set(string $name, mixed $value): void
    • __set_state(array $properties): object
    • __sleep(): array
    • __unserialize(array $data): void
    • __unset(string $name): void
    • __wakeup(): void
  • call_user_func_array() 배열 키는 이제 조용히 무시되는 대신 매개변수 이름으로 해석됩니다.
  • 네임스페이스 내에서 assert()라는 함수를 선언하는 것은 더 이상 허용되지 않으며 E_COMPILE_ERROR를 발행합니다. assert() 함수는 엔진에 의한 특별한 처리의 대상이 되며, 이는 동일한 이름을 가진 네임스페이스 함수를 정의할 때 일관성 없는 동작으로 이어질 수 있습니다.

Resource to Object Migration

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


COM and .Net (Windows)

형식 라이브러리에서 대소문자를 구분하지 않는 상수를 가져오는 기능이 제거되었습니다. com_load_typelib()에 대한 두 번째 인수는 더 이상 false가 아닐 수 있습니다. com.autoregister_casesensitive를 더 이상 비활성화할 수 없습니다. com.typelib_file의 대소문자를 구분하지 않는 마커는 무시됩니다.


CURL

CURLOPT_POSTFIELDS는 더 이상 개체를 배열로 허용하지 않습니다. 객체를 배열로 해석하려면 명시적(array) 캐스트를 수행합니다. 배열을 허용하는 다른 옵션에도 동일하게 적용됩니다.


날짜와 시간

mktime()gmmktime()은 이제 최소한 하나의 인수가 필요합니다. time()을 사용하여 현재 타임스탬프를 얻을 수 있습니다.


DOM

동작이 없고 테스트 데이터가 포함된 DOM 확장의 구현되지 않은 클래스는 제거되었습니다. 이러한 클래스는 최신 버전의 DOM 표준에서도 제거되었습니다.

  • DOMNameList
  • DomImplementationList
  • DOMConfiguration
  • DomError
  • DomErrorHandler
  • DOMImplementationSource
  • DOMLocator
  • DOMUserDataHandler
  • DOMTypeInfo

Enchant


Exif

read_exif_data()가 제거되었습니다. 대신 exif_read_data()를 사용해야 합니다.


Filter

  • FILTER_VALIDATE_URL 필터에 대한 FILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIRED 플래그가 제거되었습니다. schemehost는 항상 필요합니다.
  • filter_input() 등에 대한 INPUT_REQUESTINPUT_SESSION 소스가 제거되었습니다. 이들은 구현되지 않았으며 사용 시 항상 경고가 생성되었습니다.

GD

  • 더 이상 사용되지 않는 함수 image2wbmp()가 제거되었습니다.
  • 더 이상 사용되지 않는 함수 png2wbmp()jpeg2wbmp()가 제거되었습니다.
  • imagecropauto()의 기본 모드 매개변수는 더 이상 -1을 허용하지 않습니다. 대신 IMG_CROP_DEFAULT를 사용해야 합니다.
  • Windows에서 php_gd2.dllphp_gd.dll로 이름이 변경되었습니다.

GMP

gmp_random()이 제거되었습니다. 대신 gmp_random_range() 또는 gmp_random_bits() 중 하나를 사용해야 합니다.


Iconv

오류가 발생한 경우 errno를 올바르게 설정하지 않는 iconv 구현은 더 이상 지원되지 않습니다.


IMAP


Internationalization Functions

  • 더 이상 사용되지 않는 상수 INTL_IDNA_VARIANT_2003이 제거되었습니다.
  • 더 이상 사용되지 않는 Normalizer::NONE 상수가 제거되었습니다.

LDAP


MBString

OCI8

  • OCI-Lob 클래스는 이제 OCILob이라고 하며, OCI-Collection 클래스는 이제 PHP 8 arginfo 유형 주석 도구에 의해 시행되는 이름 준수를 위해 OCICollection이라고 합니다.
  • 여러 별칭 함수가 더 이상 사용되지 않는 것으로 표시되었습니다.
  • oci_internal_debug() 및 해당 별칭 ociinternaldebug()가 제거되었습니다.

ODBC

  • odbc_connect()는 더 이상 연결을 재사용하지 않습니다.
  • odbc_exec()의 사용하지 않는 flags 매개변수가 제거되었습니다.

OpenSSL

  • 이전 기본값 "RC4"는 안전하지 않은 것으로 간주되므로 이제 openssl_seal()openssl_open()method를 전달해야 합니다.

Regular Expressions (Perl-Compatible)

유효하지 않은 이스케이프 시퀀스를 전달할 때 더 이상 리터럴로 해석되지 않습니다. 이 동작은 이전에 X 수정자가 필요했지만 지금은 무시됩니다.


PHP Data Objects

  • 기본 오류 처리 모드가 "자동"에서 "예외"로 변경되었습니다. 자세한 내용은 오류 및 오류 처리를 참조하세요.
  • 일부 PDO 메서드의 서명이 변경되었습니다.
    • PDO::query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs)
    • PDOStatement::setFetchMode(int $mode, mixed ...$args)

PDO ODBC

php.ini 지시문 pdo_odbc.db2_instance_name이 제거되었습니다.


PDO MySQL

PDO::inTransaction()은 이제 PDO에서 유지 관리하는 근사값이 아니라 연결의 실제 트랜잭션 상태를 보고합니다. "암시적 커밋"이 적용되는 쿼리가 실행되면 트랜잭션이 더 이상 활성 상태가 아니므로 PDO::inTransaction()이 이후에 false를 반환합니다.


PostgreSQL

  • 연결 문자열 대신 여러 매개변수를 사용하는 더 이상 사용되지 않는 pg_connect() 구문은 더 이상 지원되지 않습니다.
  • 연결을 마지막 인수로 전달하는 더 이상 사용되지 않는 pg_lo_import()pg_lo_export() 서명은 더 이상 지원되지 않습니다. 연결은 대신 첫 번째 인수로 전달되어야 합니다.
  • pg_fetch_all()은 이제 행이 0인 결과 세트에 대해 false 대신 빈 배열을 반환합니다.

Phar

개체 인스턴스화, 자동 로드 등으로 인한 잠재적 보안 취약성을 수정하기 위해 phar와 연결된 메타데이터가 더 이상 자동으로 직렬화 해제되지 않습니다.


Reflection

  • 메서드 서명
    • ReflectionClass::newInstance($args)
    • ReflectionFunction::invoke($args)
    • ReflectionMethod::invoke($object, $args)

    다음으로 변경되었습니다.

    • ReflectionClass::newInstance(...$args)
    • ReflectionFunction::invoke(...$args)
    • ReflectionMethod::invoke($object, ...$args)
  • ReflectionType::__toString() 메서드는 이제 형식의 완전한 디버그 표현을 반환하며 더 이상 사용되지 않습니다. 특히 결과에는 nullable 형식에 대한 null 허용 여부 표시기가 포함됩니다. 반환 값의 형식은 안정적이지 않으며 PHP 버전 간에 변경될 수 있습니다.
  • Reflection export() 메서드가 제거되었습니다. 대신 리플렉션 개체를 문자열로 캐스팅할 수 있습니다.
  • ReflectionMethod::isConstructor()ReflectionMethod::isDestructor()는 이제 인터페이스의 __construct()__destruct() 메서드에 대해서도 true를 반환합니다. 이전에는 클래스 및 특성 메서드에만 해당되었습니다.
  • ReflectionType::isBuiltin() 메서드가 ReflectionNamedType으로 이동되었습니다. ReflectionUnionType에는 없습니다.

Sockets

  • socket_addrinfo_lookup()에 대한 더 이상 사용되지 않는 AI_IDN_ALLOW_UNASSIGNEDAI_IDN_USE_STD3_ASCII_RULES flags가 제거되었습니다.

Standard PHP Library (SPL)


Standard Library

  • assert()는 더 이상 문자열 인수를 평가하지 않으며 대신 다른 인수처럼 처리됩니다. assert('$a == $b') 대신 assert($a == $b)를 사용해야 합니다. assert.quiet_eval ini 지시문과 ASSERT_QUIET_EVAL 상수도 더 이상 영향을 미치지 않으므로 제거되었습니다.
  • parse_str()은 결과 배열을 지정하지 않고 더 이상 사용할 수 없습니다.
  • string.strip_tags 필터가 제거되었습니다.
  • strpos(), strrpos(), stripos(), strripos(), strstr(), strchr(), strrchr()stristr()의 바늘 인수는 이제 항상 문자열로 해석됩니다. 이전에는 문자열이 아닌 바늘이 ASCII 코드 포인트로 해석되었습니다. chr()에 대한 명시적 호출을 사용하여 이전 동작을 복원할 수 있습니다.
  • strpos(), strrpos(), stripos(), strripos(), strstr(), stristr()strrchr()에 대한 needle argument는 이제 비어 있을 수 있습니다.
  • substr(), substr_count(), substr_compare()iconv_substr()의 길이 인수는 이제 null이 될 수 있습니다. null 값은 길이 인수가 제공되지 않은 것처럼 작동하므로 빈 문자열 대신 문자열의 나머지 부분을 반환합니다.
  • array_splice()의 길이 인수는 이제 null이 될 수 있습니다. null 값은 인수를 생략하는 것과 동일하게 작동하므로 offset에서 배열 끝까지 모든 것을 제거합니다.
  • vsprintf(), vfprintf()vprintf()args 인수는 이제 배열이어야 합니다. 이전에는 모든 유형이 허용되었습니다.
  • password_hash()'salt' 옵션은 더 이상 지원되지 않습니다. 'salt' 옵션을 사용하면 경고가 생성되고 제공된 솔트는 무시되고 생성된 솔트가 대신 사용됩니다.
  • 빈 문자열이 전달되면 quotemeta() 함수는 이제 빈 문자열을 반환합니다. 이전에는 false가 반환되었습니다.
  • 다음 함수가 제거되었습니다.
  • FILTER_SANITIZE_MAGIC_QUOTES가 제거되었습니다.
  • 매개변수를 역순($pieces, $glue)으로 사용하여 implode()를 호출하는 것은 더 이상 지원되지 않습니다.
  • parse_url()은 이제 부재 및 빈 쿼리 및 조각을 구별합니다.
    • http://example.com/foo → query = null, fragment = null
    • http://example.com/foo? → query = "", fragment = null
    • http://example.com/foo# → query = null, fragment = ""
    • http://example.com/foo?# → query = "", fragment = ""

    이전에는 모든 경우에 쿼리 및 조각이 null이 되었습니다.

  • var_dump()debug_zval_dump()는 이제 정밀도가 아닌 serialize_precision을 사용하여 부동 소수점 숫자를 인쇄합니다. 기본 구성에서 이는 부동 소수점 숫자가 이제 이러한 디버깅 함수에 의해 완전한 정확도로 인쇄됨을 의미합니다.
  • __sleep()에서 반환된 배열에 존재하지 않는 속성이 포함된 경우 이제 이러한 속성이 자동으로 무시됩니다. 이전에는 이러한 속성이 값이 null인 것처럼 직렬화되었습니다.
  • 시작 시 기본 로케일은 이제 항상 "C"입니다. 기본적으로 환경에서 로케일이 상속되지 않습니다. 이전에는 LC_ALL"C"로 설정되었지만 LC_CTYPE은 환경에서 상속되었습니다. 그러나 일부 함수는 명시적인 setlocale() 호출 없이 상속된 로케일을 준수하지 않습니다. 로케일 구성 요소를 기본값에서 변경해야 하는 경우 명시적 setlocale() 호출이 항상 필요합니다.
  • crypt()에서 더 이상 사용되지 않는 DES 대체가 제거되었습니다. 알 수 없는 솔트 형식이 crypt()에 전달되면 함수는 지금 약한 DES 해시로 폴백하는 대신 *0과 함께 실패합니다.
  • SHA256/SHA512 crypt()에 대한 범위 외 라운드 지정은 이제 가장 가까운 제한으로 고정하는 대신 *0과 함께 실패합니다. 이것은 glibc 동작과 일치합니다.
  • 배열에 동일한 것으로 비교되는 요소가 포함된 경우 정렬 함수의 결과가 변경되었을 수 있습니다.
  • 참조 매개변수를 허용하도록 명시적으로 지정되지 않은 콜백을 허용하는 모든 함수는 이제 참조 매개변수가 있는 콜백이 사용되는 경우 경고합니다. 예에는 array_filter()array_reduce()가 포함됩니다. 이것은 이전에 모든 함수가 아닌 대부분의 함수에 대해 이미 적용되었습니다.
  • file_get_contents()와 같은 함수에서 사용하는 HTTP 스트림 래퍼는 이제 기본적으로 HTTP/1.0이 아닌 HTTP/1.1을 광고합니다. 이렇게 하면 클라이언트의 동작이 변경되지 않지만 서버가 다르게 응답할 수 있습니다. 이전 동작을 유지하려면 'protocol_version' 스트림 컨텍스트 옵션을 설정하세요.
                          
    <?php
    $ctx = stream_context_create(['http' => ['protocol_version' => '1.0']]);
    echo file_get_contents('http://example.org', false, $ctx);
    ?>
                          
                        
  • 명시적 솔트 없이 crypt()를 호출하는 것은 더 이상 지원되지 않습니다. 자동 생성된 솔트로 강력한 해시를 생성하려면 대신 password_hash()를 사용하십시오.
  • substr(), mb_substr(), iconv_substr()grapheme_substr()은 이제 일관되게 범위를 벗어난 오프셋을 문자열 경계로 고정합니다. 이전에는 경우에 따라 빈 문자열 대신 false가 반환되었습니다.
  • Windows에서 쉘을 사용하는 프로그램 실행 함수(proc_open(), exec(), popen() 등)는 이제 $commandline을 실행하는 것과 동일한 효과를 갖는 %comspec% /s /c "$commandline"을 일관되게 실행합니다. (추가 따옴표 없이).

Sysvsem

  • sem_get()auto_release 매개변수는 int가 아닌 bool 값을 허용하도록 변경되었습니다.

Tidy


Tokenizer

  • T_COMMENT 토큰에는 더 이상 후행 줄 바꿈이 포함되지 않습니다. 줄 바꿈은 대신 다음 T_WHITESPACE 토큰의 일부가 됩니다. T_COMMENT 뒤에 항상 공백이 있는 것은 아니며 T_CLOSE_TAG 또는 파일 끝이 뒤에 올 수도 있습니다.
  • 네임스페이스 이름은 이제 T_NAME_QUALIFIED(Foo\Bar), T_NAME_FULLY_QUALIFIED(\Foo\Bar) 및 T_NAME_RELATIVE(namespace\Foo\Bar) 토큰을 사용하여 표시됩니다. T_NS_SEPARATOR는 독립형 네임스페이스 구분 기호에만 사용되며 그룹 사용 선언과 함께 구문적으로만 유효합니다.

XMLReader

XMLReader::open()XMLReader::xml()은 이제 정적 메서드입니다. 여전히 인스턴스 메서드로 호출할 수 있지만 상속 클래스는 이러한 메서드를 재정의하는 경우 해당 메서드를 정적으로 선언해야 합니다.


XML-RPC

XML-RPC 확장은 PECL로 이동되었으며 더 이상 PHP 배포의 일부가 아닙니다.


Zip

ZipArchive::OPSYS_Z_CPM이 제거되었습니다(이 이름은 오타). 대신 ZipArchive::OPSYS_CPM을 사용하십시오.


Zlib


Windows PHP Test Packs

테스트 실행기는 php-src의 이름과 일치하도록 run-test.php에서 run-tests.php로 이름이 변경되었습니다.