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_NOTICE
및E_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
검사로 대체되어야 합니다.
- curl_init()는 이제 리소스가 아닌 CurlHandle 객체를 반환합니다. curl_close() 함수는 더 이상 효과가 없으며 대신 CurlHandle 인스턴스가 더 이상 참조되지 않으면 자동으로 소멸됩니다.
- curl_multi_init()는 이제 리소스가 아닌 CurlMultiHandle 객체를 반환합니다. curl_multi_close() 함수는 더 이상 효과가 없으며 대신 CurlMultiHandle 인스턴스가 더 이상 참조되지 않으면 자동으로 소멸됩니다.
- curl_share_init()는 이제 리소스가 아닌 CurlShareHandle 객체를 반환합니다. curl_share_close() 함수는 더 이상 효과가 없으며 대신 CurlShareHandle 인스턴스가 더 이상 참조되지 않으면 자동으로 소멸됩니다.
- enchant_broker_init()는 이제 리소스이 아닌 EnchantBroker 객체를 반환합니다.
- enchant_broker_request_dict() 및 enchant_broker_request_pwl_dict()는 이제 리소스가 아닌 EnchantDictionary 개체를 반환합니다.
- GD 확장은 이제 GdImage 개체를 리소스가 아닌 이미지의 기본 데이터 구조로 사용합니다. imagedestroy() 함수는 더 이상 효과가 없습니다. 대신 GdImage 인스턴스가 더 이상 참조되지 않으면 자동으로 소멸됩니다.
- openssl_x509_read() 및 openssl_csr_sign()은 이제 리소스가 아닌 OpenSSLCertificate 개체를 반환합니다. openssl_x509_free() 함수는 더 이상 사용되지 않으며 더 이상 효과가 없습니다. 대신 OpenSSLCertificate 인스턴스가 더 이상 참조되지 않으면 자동으로 소멸됩니다.
- openssl_csr_new()는 이제 리소스가 아닌 OpenSSLCertificateSigningRequest 객체를 반환합니다.
- openssl_pkey_new()는 이제 리소스가 아닌 OpenSSLAsymmetricKey 객체를 반환합니다. openssl_pkey_free() 함수는 더 이상 사용되지 않으며 더 이상 효과가 없습니다. 대신 OpenSSLAsymmetricKey 인스턴스가 더 이상 참조되지 않으면 자동으로 소멸됩니다.
- shmop_open()은 이제 리소스가 아닌 Shmop 객체를 반환합니다. shmop_close() 함수는 더 이상 효과가 없으며 더 이상 사용되지 않습니다. 대신 Shmop 인스턴스는 더 이상 참조되지 않으면 자동으로 소멸됩니다.
- socket_create(), socket_create_listen(), socket_accept(), socket_import_stream(), socket_addrinfo_connect(), socket_addrinfo_bind() 및 socket_wsaprotocol_info_import()는 이제 리소스가 아닌 Socket 개체를 반환합니다. socket_addrinfo_lookup()은 이제 리소스가 아닌 AddressInfo 개체의 배열을 반환합니다.
- msg_get_queue()는 이제 리소스가 아닌 SysvMessageQueue 개체를 반환합니다.
- sem_get()은 이제 리소스가 아닌 SysvSemaphore 개체를 반환합니다.
- shm_attach()는 이제 리소스가 아닌 SysvSharedMemory 개체를 반환합니다.
- xml_parser_create() 및 xml_parser_create_ns()는 이제 리소스가 아닌 XMLParser 개체를 반환합니다. xml_parser_free() 함수는 더 이상 효과가 없습니다. 대신 XMLParser 인스턴스가 더 이상 참조되지 않으면 자동으로 소멸됩니다.
- 이제 XMLWriter 함수는 리소스 대신 XMLWriter 개체를 각각 수락하고 반환합니다.
- inflate_init()는 이제 리소스가 아닌 InflateContext 객체를 반환합니다.
- deflate_init()은 이제 리소스가 아닌 DeflateContext 객체를 반환합니다.
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
- enchant_broker_list_dicts(), enchant_broker_describe() 및 enchant_dict_suggest()는 이제
null
대신 빈 배열을 반환합니다.
Exif
read_exif_data()가 제거되었습니다. 대신 exif_read_data()를 사용해야 합니다.
Filter
-
FILTER_VALIDATE_URL
필터에 대한FILTER_FLAG_SCHEME_REQUIRED
및FILTER_FLAG_HOST_REQUIRED
플래그가 제거되었습니다.scheme
와host
는 항상 필요합니다. - filter_input() 등에 대한
INPUT_REQUEST
및INPUT_SESSION
소스가 제거되었습니다. 이들은 구현되지 않았으며 사용 시 항상 경고가 생성되었습니다.
GD
- 더 이상 사용되지 않는 함수 image2wbmp()가 제거되었습니다.
- 더 이상 사용되지 않는 함수 png2wbmp() 및 jpeg2wbmp()가 제거되었습니다.
- imagecropauto()의 기본 모드 매개변수는 더 이상
-1
을 허용하지 않습니다. 대신IMG_CROP_DEFAULT
를 사용해야 합니다. - Windows에서 php_gd2.dll은 php_gd.dll로 이름이 변경되었습니다.
GMP
gmp_random()이 제거되었습니다. 대신 gmp_random_range() 또는 gmp_random_bits() 중 하나를 사용해야 합니다.
Iconv
오류가 발생한 경우 errno를 올바르게 설정하지 않는 iconv 구현은 더 이상 지원되지 않습니다.
IMAP
- imap_headerinfo()의 사용하지 않는
default_host
인수가 제거되었습니다. - imap_headerinfo()의 별칭인 imap_header() 함수가 제거되었습니다.
Internationalization Functions
- 더 이상 사용되지 않는 상수
INTL_IDNA_VARIANT_2003
이 제거되었습니다. - 더 이상 사용되지 않는
Normalizer::NONE
상수가 제거되었습니다.
LDAP
- 더 이상 사용되지 않는 함수 ldap_sort(), ldap_control_paged_result() 및 ldap_control_paged_result_response()가 제거되었습니다.
- ldap_set_rebind_proc()의 인터페이스가 변경되었습니다.
callback
매개변수는 더 이상 빈 문자열을 허용하지 않습니다. 대신null
을 사용해야 합니다.
MBString
- mbstring.func_overload 지시문이 제거되었습니다. 관련
MB_OVERLOAD_MAIL
,MB_OVERLOAD_STRING
및MB_OVERLOAD_REGEX
상수도 제거되었습니다. 마지막으로 mb_get_info()의"func_overload"
및"func_overload_list"
항목이 제거되었습니다. - 결과 배열을 지정하지 않으면 mb_parse_str()을 더 이상 사용할 수 없습니다.
- 사용되지 않는 많은 mbregex 별칭이 제거되었습니다. 대신 사용해야 하는 함수는 다음 목록을 참조하세요.
- mbregex_encoding() → mb_regex_encoding()
- mbereg() → mb_ereg()
- mberegi() → mb_eregi()
- mbereg_replace() → mb_ereg_replace()
- mberegi_replace() → mb_eregi_replace()
- mbsplit() → mb_split()
- mbereg_match() → mb_ereg_match()
- mbereg_search() → mb_ereg_search()
- mbereg_search_pos() → mb_ereg_search_pos()
- mbereg_search_regs() → mb_ereg_search_regs()
- mbereg_search_init() → mb_ereg_search_init()
- mbereg_search_getregs() → mb_ereg_search_getregs()
- mbereg_search_getpos() → mb_ereg_search_getpos()
- mbereg_search_setpos() → mb_ereg_search_setpos()
- mb_ereg_replace()에 대한
e
수정자가 제거되었습니다. 대신 mb_ereg_replace_callback()을 사용해야 합니다. - mb_ereg_replace()에 대한 비문자열 패턴 인수는 이제 ASCII 코드포인트 대신 문자열로 해석됩니다. 이전 동작은 chr()을 명시적으로 호출하여 복원할 수 있습니다.
- mb_strpos(), mb_strrpos(), mb_stripos(), mb_strripos(), mb_strstr(), mb_stristr(), mb_strrchr() 및 mb_strrichr()에 대한
needle
인수는 이제 비어 있을 수 있습니다. - 내부적으로 사용되지 않은
is_hex
매개변수는 mb_decode_numericentity()에서 제거되었습니다. - 인코딩을 mb_strrpos() 함수에 대한 오프셋 대신 세 번째 인수로 전달하는 레거시 동작이 제거되었습니다. 인코딩이 포함된 명시적
0
오프셋은 대신 네 번째 인수로 제공되어야 합니다. - iconv 확장과의 더 나은 상호 운용성을 위해
ISO_8859-*
문자 인코딩 별칭이ISO8859-*
별칭으로 대체되었습니다. 밑줄이 있는 mbregex ISO 8859 별칭(ISO_8859_*
및ISO8859_*
)도 제거되었습니다. - mb_ereg() 및 mb_eregi()는 이제 성공적인
matches
에서 부울true
를 반환합니다. 이전에는 일치 항목이 전달되지 않은 경우 정수1
을 반환하고 일치 항목이 전달된 경우max(1, strlen($matches[0]))
을 반환했습니다.
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_UNASSIGNED
및AI_IDN_USE_STD3_ASCII_RULES
flags
가 제거되었습니다.
Standard PHP Library (SPL)
- SplFileObject::fgetss()가 제거되었습니다.
- 이제 SplFileObject::seek()는 항상 줄의 시작 부분을 찾습니다. 이전에는 위치
=1
이 다음 줄의 시작 부분을 찾았습니다. - SplHeap::compare()는 이제 메서드 서명을 지정합니다. 이 메서드를 구현하는 상속 클래스는 이제 호환 가능한 메서드 서명을 사용해야 합니다.
- SplDoublyLinkedList::push(), SplDoublyLinkedList::unshift() 및 SplQueue::enqueue()는 이제
true
대신 void를 반환합니다. - 이제 spl_autoload_register()는 잘못된 인수에 대해 항상 TypeError를 발생시키므로 두 번째 인수
do_throw
는 무시되고false
로 설정된 경우 알림이 표시됩니다. - SplFixedArray는 이제 Iterator가 아니라 IteratorAggregate입니다. SplFixedArray::rewind(), SplFixedArray::current(), SplFixedArray::key(), SplFixedArray::next() 및 SplFixedArray::valid()가 제거되었습니다. 대신 SplFixedArray::getIterator()가 추가되었습니다. SplFixedArray에 대한 명시적 반복을 사용하는 모든 코드는 이제 SplFixedArray::getIterator()를 통해 Iterator를 가져와야 합니다. 즉, 이제 SplFixedArray를 중첩 루프에서 안전하게 사용할 수 있습니다.
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
- 내부적으로 사용되지 않던
use_include_path
파라미터는 tidy_repair_string()에서 삭제되었습니다. - Tidy::repairString() 및 Tidy::repairFile()은 정적 메서드가 되었습니다.
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
- gzgetss()가 제거되었습니다.
- zlib.output_compression은 더 이상
Content-Type: image/*
에 대해 자동으로 비활성화되지 않습니다.
Windows PHP Test Packs
테스트 실행기는 php-src의 이름과 일치하도록 run-test.php에서 run-tests.php로 이름이 변경되었습니다.