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

Throw on passing too few function arguments

이전에는 인수가 너무 적은 사용자 정의 함수를 호출하면 경고가 발생했습니다. 이제 이 경고가 오류 예외로 승격되었습니다. 이 변경 사항은 내부 함수가 아닌 사용자 정의 함수에만 적용됩니다. 예를 들어:

                  
<?php
function test($param){}
test();
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
                

Forbid dynamic calls to scope introspection functions

특정 함수에 대한 동적 호출이 금지되었습니다($func() 또는 array_map('extract', ...) 등의 형식). 이러한 함수는 다른 범위를 검사하거나 수정하고 모호하고 신뢰할 수 없는 동작을 나타냅니다. 함수는 다음과 같습니다.

                  
<?php
(function () {
    $func = 'func_num_args';
    $func();
})();
                  
                

위의 예는 다음을 출력합니다.

Warning: Cannot call func_num_args() dynamically in %s on line %d
                

Invalid class, interface, and trait names

다음 이름은 클래스, 인터페이스 또는 특성의 이름을 지정하는 데 사용할 수 없습니다.


Numerical string conversions now respect scientific notation

숫자 문자열에 대한 정수 연산 및 변환은 이제 과학적 표기법을 따릅니다. 여기에는 (int) 캐스트 작업과 intval()(여기서 기수는 10), settype(), decbin(), decoct()dechex() 함수도 포함됩니다.


Fixes to mt_rand() algorithm

mt_rand()는 이제 Mersenne Twister 알고리즘의 고정 버전을 사용하도록 기본 설정됩니다. mt_srand()의 결정적 출력에 의존하는 경우 mt_srand()에 대한 추가 선택적 두 번째 매개변수를 통해 이전(잘못된) 구현을 보존하는 기능이 있는 MT_RAND_PHP.


rand() aliased to mt_rand() and srand() aliased to mt_srand()

rand()srand()는 이제 각각 mt_rand() 및 mt_srand()에 대한 별칭이 되었습니다. 이는 rand(), shuffle(), str_shuffle()array_rand() 함수의 출력이 변경되었음을 의미합니다.


Disallow the ASCII delete control character in identifiers

ASCII 삭제 제어 문자(0x7F)는 따옴표로 묶이지 않은 식별자에 더 이상 사용할 수 없습니다.


error_log changes with syslog value

error_log ini 설정이 syslog로 설정되어 있으면 PHP 오류 수준이 syslog 오류 수준에 매핑됩니다. 이것은 모든 오류가 통지 수준으로만 기록되는 이전 접근 방식과 달리 오류 로그에서 더 미세한 구분을 가져옵니다.


Do not call destructors on incomplete objects

소멸자는 이제 생성자를 실행하는 동안 예외를 throw하는 개체에 대해 호출되지 않습니다. 이전 버전에서 이 동작은 객체가 생성자 외부에서 참조되었는지 여부(예: 예외 역추적)에 따라 달라졌습니다.


call_user_func() handling of reference arguments

call_user_func()는 이제 참조를 인수로 예상하는 함수를 호출할 때 항상 경고를 생성합니다. 이전에는 호출이 정규화되었는지 여부에 따라 다릅니다.

또한 call_user_func()call_user_func_array()는 이 경우 더 이상 함수 호출을 중단하지 않습니다. "예상된 참조" 경고가 표시되지만 호출은 평소와 같이 진행됩니다.


The empty index operator is not supported for strings anymore

빈 인덱스 연산자를 문자열(예: $str[] = $x)에 적용하면 자동으로 배열로 변환하는 대신 치명적인 오류가 발생합니다.


Assignment via string index access on an empty string

빈 문자열의 문자에 의한 문자열 수정은 이제 비어 있지 않은 문자열의 경우처럼 작동합니다. 즉, 범위를 벗어난 오프셋에 쓰는 것은 문자열을 공백으로 채웁니다. 여기서 정수가 아닌 유형은 정수로 변환되고 할당된 문자열의 첫 번째 문자만 사용. 이전에는 빈 배열처럼 자동으로 처리되는 빈 문자열입니다.

                  
<?php
$a = '';
$a[10] = 'foo';
var_dump($a);
?>
                  
                

PHP 7.0에서 위 예제의 출력:

array(1) {
  [10]=>
  string(3) "foo"
}
                

PHP 7.1에서 위 예제의 출력:

string(11) "          f"
                

Removed ini directives

다음 ini 지시문이 제거되었습니다.

  • session.entropy_file
  • session.entropy_length
  • session.hash_function
  • session.hash_bits_per_character

Array ordering when elements are automatically created during by reference assignments has changed

참조 할당에서 해당 요소를 참조하여 자동으로 생성된 경우 배열의 요소 순서가 변경되었습니다. 예를 들어:

                  
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>
                  
                

PHP 7.0에서 위 예제의 출력:

array(2) {
  ["a"]=>
  &int(1)
  ["b"]=>
  &int(1)
}
                

PHP 7.1에서 위 예제의 출력:

array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}
                

Sort order of equal elements

내부 정렬 알고리즘이 개선되어 이전과 동일한 것으로 비교되는 요소의 정렬 순서가 다를 수 있습니다.

메모: 동일한 것으로 비교되는 요소의 순서에 의존하지 마십시오. 언제든지 바뀔 수 있습니다.


Error message for E_RECOVERABLE errors

E_RECOVERABLE 오류에 대한 오류 메시지가 "Catchable 치명적 오류"에서 "Recoverable 치명적 오류"로 변경되었습니다.


$options parameter of unserialize()

unserialize()의 $options 매개변수의 allowed_classes 요소는 이제 엄격하게 유형이 지정됩니다. 즉, 배열이나 bool 이외의 것이 제공되면 unserialize()는 false를 반환하고 E_WARNING을 발행합니다.


DateTime constructor incorporates microseconds

DateTimeDateTimeImmutable은 명시적으로 또는 상대 문자열(예: "다음 달의 첫째 날")을 사용하여 현재 시간에서 구성될 때 마이크로초를 이제 올바르게 통합합니다. 이것은 새로 생성된 두 인스턴스의 순진한 비교가 이제 true 대신 false를 반환할 가능성이 더 높다는 것을 의미합니다.

                  
<?php
new DateTime() == new DateTime();
?>
                  
                

Fatal errors to Error exceptions conversions

Date 확장에서 DateTime 또는 DatePeriod 클래스에 대한 잘못된 직렬화 데이터 또는 직렬화된 데이터의 시간대 초기화 실패는 이제 치명적인 오류를 초래하는 대신 __wakeup() 또는 __set_state() 메서드에서 Error 예외를 발생시킵니다.

DBA 확장에서 데이터 수정 함수(예: dba_insert())는 이제 키에 정확히 두 개의 요소가 포함되지 않은 경우 잡을 수 있는 치명적인 오류를 트리거하는 대신 Error 예외를 throw합니다.

DOM 확장에서 잘못된 스키마 또는 RelaxNG 유효성 검사 컨텍스트는 이제 치명적인 오류를 초래하는 대신 Error 예외를 발생시킵니다. 마찬가지로, 적절한 기본 클래스를 확장하지 않는 노드 클래스를 등록하려고 하거나 잘못된 속성을 읽거나 읽기 전용 속성에 쓰려고 하면 이제 Error 예외가 발생합니다.

IMAP 확장에서 이메일 주소가 16385바이트보다 길면 치명적인 오류가 발생하는 대신 Error 예외가 발생합니다.

Intl 확장에서 부모 메서드를 호출하기 전에 Collator를 확장하는 클래스에서 부모 생성자를 호출하지 않으면 복구 가능한 치명적인 Error가 발생하는 대신 오류가 발생합니다. 또한 Transliterator 개체를 복제하면 치명적인 오류가 발생하는 대신 내부 음역자를 복제하지 못한 경우 Error 예외가 발생합니다.

LDAP 확장에서 ldap_batch_modify()에 알 수 없는 수정 유형을 제공하면 치명적인 오류가 발생하는 대신 Error 예외가 발생합니다.

mbstring 확장에서 mb_ereg()mb_eregi() 함수는 잘못된 PHP 표현식이 제공되고 'e' 옵션이 사용되는 경우 ParseError 예외를 발생시킵니다.

Mcrypt 확장에서 mcrypt_encrypt()mcrypt_decrypt()는 이제 mcrypt를 초기화할 수 없는 경우 치명적인 오류를 발생시키는 대신 Error 예외를 발생시킵니다.

mysqli 확장에서 유효하지 않은 속성을 읽거나 읽기 전용 속성에 쓰려고 하면 치명적인 오류가 발생하는 대신 Error 예외가 발생합니다.

리플렉션 확장에서 리플렉션 개체를 검색하거나 개체 속성을 검색하는 데 실패하면 이제 치명적인 오류가 발생하는 대신 Error 예외가 발생합니다.

세션 확장에서 세션 ID에 대한 문자열을 반환하지 않는 사용자 정의 세션 핸들러는 이제 세션 ID를 생성해야 하는 함수가 호출될 때 치명적인 오류를 초래하는 대신 Error 예외를 발생시킵니다.

SimpleXML 확장에서 이름이 지정되지 않거나 중복된 속성을 만들면 이제 치명적인 오류가 발생하는 대신 Error 예외가 발생합니다.

SPL 확장에서 SplDirectory 개체를 복제하려고 하면 치명적인 오류가 발생하는 대신 Error 예외가 발생합니다. 마찬가지로, 객체를 반복할 때 ArrayIterator::append()를 호출하면 이제 Error 예외가 발생합니다.

표준 확장에서 assert() 함수는 문자열 인수가 첫 번째 매개변수로 제공될 때 PHP 코드가 유효하지 않은 경우 잡을 수 있는 치명적인 오류를 초래하는 대신 ParseError 예외를 발생시킵니다. 마찬가지로 클래스 범위 외부에서 forward_static_call()을 호출하면 이제 Error 예외가 발생합니다.

Tidy 확장에서 수동으로 TidyNode를 생성하면 치명적인 오류가 발생하는 대신 Error 예외가 발생합니다.

WDDX 확장에서 직렬화 시 순환 참조는 이제 치명적인 오류를 초래하는 대신 Error 예외를 발생시킵니다.

XML-RPC 확장에서 직렬화할 때 순환 참조는 이제 치명적인 오류를 초래하는 대신 Error 예외 인스턴스를 발생시킵니다.

Zip 확장에서 ZipArchive::addGlob() 메서드는 이제 glob 지원을 사용할 수 없는 경우 치명적인 오류가 발생하는 대신 Error 예외를 발생시킵니다.


Lexically bound variables cannot reuse names

use 구문을 통해 클로저에 바인딩된 변수는 superglobals, $this 또는 매개변수와 같은 이름을 사용할 수 없습니다. 예를 들어, 이러한 모든 함수 정의는 치명적인 오류를 발생시킵니다.

                  
<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};
                  
                

long2ip() parameter type change

long2ip()는 이제 문자열 대신 int를 기대합니다.


JSON encoding and decoding

serialize_precision ini 설정은 이제 double을 인코딩할 때 직렬화 정밀도를 제어합니다.

이제 빈 키를 디코딩하면 속성 이름이 _empty_가 아닌 빈 속성 이름이 됩니다.

                  
<?php
var_dump(json_decode(json_encode(['' => 1])));
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

object(stdClass)#1 (1) {
  [""]=>
  int(1)
}
                

JSON_UNESCAPED_UNICODE 플래그를 json_encode()에 제공하면 시퀀스 U+2028 및 U+2029가 이제 이스케이프됩니다.


Changes to mb_ereg() and mb_eregi() parameter semantics

mb_ereg()mb_eregi() 함수(regs)의 세 번째 매개변수는 일치하는 항목이 없으면 빈 배열로 설정됩니다. 이전에는 매개변수가 수정되지 않았습니다.


Drop support for the sslv2 stream

sslv2 스트림은 이제 OpenSSL에서 삭제되었습니다.


Forbid "return;" for typed returns already at compile-time

반환 형식을 선언하는 함수에서 인수가 없는 반환 문은 이제 반환 문에 도달할 수 없는 경우에도 E_COMPILE_ERROR를 트리거합니다(반환 형식이 void로 선언되지 않은 경우).