PHP 5.6 migration 7.0
PHP 7 에서의 문법이 달라진 부분들이 실제 사용되는 코드들이 늘어남에 따라
정리해둘 필요가 있는요소다
이전 버전과 호환되지 않는 변경 사항 ¶ 오류 및 예외 처리 변경 ¶ 많은 치명적이고 복구 가능한 치명적 오류가 PHP 7에서 예외로 변환되었습니다. 이러한 오류 예외 는 자체적으로 Throwable 인터페이스(모든 예외가 상속하는 새 기본 인터페이스)를 구현하는 Error 클래스에서 상속됩니다.
즉, 예외가 대신 throw될 수 있기 때문에 사용자 지정 오류 처리기가 더 이상 트리거되지 않을 수 있습니다(캐치되지 않은 오류 예외에 대해 새로운 치명적인 오류가 발생함).
PHP 7에서 오류가 작동하는 방식에 대한 자세한 설명은 PHP 7 오류 페이지 에서 찾을 수 있습니다 . 이 마이그레이션 가이드는 이전 버전과의 호환성에 영향을 미치는 변경 사항을 열거할 뿐입니다.
set_exception_handler() 는 더 이상 예외 객체 수신을 보장하지 않습니다 .¶ Exception 의 유형 선언을 사용하여 set_exception_handler()로 등록된 예외 처리기를 구현하는 코드 는 Error 개체가 throw 될 때 치명적인 오류 를 발생시킵니다.
핸들러가 PHP 5와 7 모두에서 작동해야 하는 경우 핸들러에서 유형 선언을 제거해야 합니다. 반면 PHP 7에서만 작동하도록 마이그레이션되는 코드는 예외 유형 선언을 대신 Throwable로 대체할 수 있습니다 .
<?php // PHP 5 era code that will break. function handler(Exception $e) { ... } set_exception_handler('handler');
// PHP 5 and 7 compatible. function handler($e) { ... }
// PHP 7 only. function handler(Throwable $e) { ... } ?> 내부 생성자는 항상 실패 시 예외를 던집니다 ¶ 이전 null에는 생성자가 실패하면 일부 내부 클래스가 또는 사용할 수 없는 개체를 반환 했습니다. 이제 모든 내부 클래스는 이 경우 사용자 클래스가 이미 수행한 것과 동일한 방식으로 예외 를 발생시킵니다.
구문 분석 오류는 ParseError를 던집니다 ¶ 파서 오류는 이제 ParseError 개체를 발생시킵니다. eval()에 대한 오류 처리 는 이제 catch이 오류를 처리할 수 있는 블록을 포함해야 합니다.
E_STRICT는 심각도 변경을 통지합니다 ¶ 모든 E_STRICT알림은 다른 수준으로 재분류되었습니다. E_STRICT상수가 유지되므로 like error_reporting(E_ALL|E_STRICT)를 호출 해도 오류가 발생하지 않습니다.
E_STRICT 심각도 변경 통지 상황 새로운 수준/행동 리소스별 인덱싱 E_NOTICE 추상 정적 메서드 알림이 제거되었으며 오류가 발생하지 않습니다. 생성자 "재정의" 알림이 제거되었으며 오류가 발생하지 않습니다. 상속 중 서명 불일치 E_WARNING 두 개의 사용된 특성에서 동일한(호환 가능한) 속성 알림이 제거되었으며 오류가 발생하지 않습니다. 비정적으로 정적 속성에 액세스 E_NOTICE 참조로 변수만 할당해야 합니다. E_NOTICE 변수만 참조로 전달해야 합니다. E_NOTICE 비정적 메서드를 정적으로 호출 E_DEPRECATED 변수 처리 변경 ¶ PHP 7은 이제 소스 파일을 구문 분석할 때 추상 구문 트리를 사용합니다. 이를 통해 이전 버전의 PHP에서 사용된 구문 분석기의 제한으로 인해 이전에 불가능했던 언어에 대한 많은 개선이 허용되었지만 일관성을 위해 몇 가지 특별한 경우가 제거되어 이전 버전과의 호환성이 중단되었습니다. 이러한 경우는 이 섹션에서 자세히 설명합니다.
간접 변수, 속성 및 메서드 처리 변경 ¶ 변수, 속성 및 메서드에 대한 간접 액세스는 이제 이전의 특수한 경우와 달리 왼쪽에서 오른쪽 순서로 엄격하게 평가됩니다. 아래 표는 평가 순서가 어떻게 변경되었는지 보여줍니다.
간접 표현의 기존 및 새로운 평가 표현 PHP 5 해석 PHP 7 해석 $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']() 이전 오른쪽에서 왼쪽 평가 순서를 사용한 코드는 중괄호와 함께 해당 평가 순서를 명시적으로 사용하도록 다시 작성해야 합니다(위의 중간 열 참조). 이렇게 하면 코드가 PHP 7.x와 앞으로 호환 가능하고 PHP 5.x와 역호환이 됩니다.
이는 global키워드 에도 영향을 미칩니다 . 필요한 경우 중괄호 구문을 사용하여 이전 동작을 에뮬레이트할 수 있습니다.
<?php function f() { // Valid in PHP 5 only. global $$foo->bar;
// Valid in PHP 5 and 7.
global ${$foo->bar};
} ?> list() 처리 변경 ¶ list() 는 더 이상 역순으로 변수를 할당하지 않습니다. list() 는 이제 역순이 아니라 정의된 순서대로 변수에 값을 할당합니다. 일반적으로 이는 아래와 같이 list() 가 배열[]연산자와 함께 사용되는경우에만 영향을 미칩니다.
<?php list($a[], $a[], $a[]) = [1, 2, 3]; var_dump($a); ?> PHP 5에서 위 예제의 출력:
배열(3) { [0]=> 정수(3) [1]=> 정수(2) [2]=> 정수(1) } PHP 7에서 위 예제의 출력:
배열(3) { [0]=> 정수(1) [1]=> 정수(2) [2]=> 정수(3) } 일반적으로 list() 할당이 발생 하는 순서에 의존하지 않는 것이 좋습니다 . 이는 나중에 다시 변경될 수 있는 구현 세부 사항이기 때문입니다.
빈 list() 할당이 제거되었습니다. list() 구문은 더 이상 비워둘 수 없습니다. 다음은 더 이상 허용되지 않습니다.
<?php list() = $a; list(,,) = $a; list($x, list(), $y) = $a; ?> list() 는 문자열 s의압축을 풀 수 없습니다. list() 는 더 이상 문자열 변수의압축을 풀 수 없습니다. 대신 str_split()을 사용해야 합니다.
참조 할당에 의해 요소가 자동으로 생성될 때 배열 순서가 변경되었습니다 .¶ 참조 할당에서 해당 요소를 참조하여 자동으로 생성된 경우 배열의 요소 순서가 변경되었습니다. 예를 들어:
<?php $array = []; $array["a"] =& $array["b"]; $array["b"] = 1; var_dump($array); ?> PHP 5에서 위 예제의 출력:
배열(2) { ["b"]=> &int(1) ["아"]=> &int(1) } PHP 7에서 위 예제의 출력:
배열(2) { ["아"]=> &int(1) ["b"]=> &int(1) } 함수 인수 주위의 괄호는 더 이상 동작에 영향을 미치지 않습니다 .¶ PHP 5에서 함수 인수 주위에 중복 괄호를 사용하면 함수 인수가 참조로 전달될 때 엄격한 표준 경고를 완화할 수 있습니다. 경고는 이제 항상 발행됩니다.
<?php function getArray() { return [1, 2, 3]; }
function squareArray(array &$a) { foreach ($a as &$v) { $v **= 2; } }
// Generates a warning in PHP 7. squareArray((getArray())); ?> 위의 예는 다음을 출력합니다.
알림: 13행의 /tmp/test.php에서 변수만 참조로 전달해야 합니다. foreach의 변경 사항 ¶ 주로 내부 배열 포인터 처리 및 반복되는 배열 수정과 관련된 foreach 제어 구조 의 동작이 약간 변경되었습니다 .
foreach 는 더 이상 내부 배열 포인터를 변경하지 않습니다 ¶ PHP 7 이전에는 foreach로 배열을 반복하는 동안 내부 배열 포인터가 수정되었습니다 . 다음 예와 같이 더 이상 그렇지 않습니다.
<?php $array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); } ?> PHP 5에서 위 예제의 출력:
정수(1) 정수(2) 부울(거짓) PHP 7에서 위 예제의 출력:
정수(0) 정수(0) 정수(0) foreach by-value는 배열의 복사본에서 작동합니다 ¶ 기본 값별 모드에서 사용할 때 foreach 는 이제 배열 자체가 아니라 반복되는 배열의 복사본에서 작동합니다. 이는 반복 중에 수행된 배열 변경 사항이 반복되는 값에 영향을 미치지 않음을 의미합니다.
foreach by-reference는 반복 동작을 개선했습니다 ¶ 참조로 반복할 때 foreach 는 이제 반복 중에 이루어진 배열의 변경 사항을 더 잘 추적합니다. 예를 들어, 반복하는 동안 배열에 추가하면 이제 추가된 값도 반복됩니다.
<?php $array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; } ?> PHP 5에서 위 예제의 출력:
정수(0) PHP 7에서 위 예제의 출력:
정수(0) 정수(1) 순회할 수 없는 객체의 반복 ¶ Traversable 이 아닌 객체 에 대한 반복 은 이제 참조에 의한 배열에 대한 반복과 동일한 동작을 갖습니다. 그 결과 객체에 속성이 추가되거나 객체에서 제거될 때도 적용 되는 반복 중에 배열을 수정할 때 향상된 동작이 발생 합니다.
int 처리에 대한 변경 사항 ¶ 유효하지 않은 8진수 리터럴 ¶ 이전에는 유효하지 않은 숫자가 포함된 8진수 리터럴이 자동으로 잘렸습니다( 0128로 간주됨 012). 이제 잘못된 8진수 리터럴로 인해 구문 분석 오류가 발생합니다.
음의 비트 시프트 ¶ 음수에 의한 비트 시프트는 이제 ArithmeticError를 발생 시킵니다 :
<?php var_dump(1 >> -1); ?> PHP 5에서 위 예제의 출력:
정수(0) PHP 7에서 위 예제의 출력:
치명적인 오류: 잡히지 않은 ArithmeticError: /tmp/test.php:2에서 음수로 비트 이동 스택 추적:
0 {메인}
2행의 /tmp/test.php에 던져졌습니다. 범위를 벗어난 비트 시프트 ¶ int 의 비트 너비를 초과하는 비트 시프트(어느 방향이든) 는 항상 0이 됩니다. 이전에는 이러한 시프트의 동작이 아키텍처에 따라 다릅니다.
0으로 나누기에 대한 변경 사항 ¶ 이전에는 나누기(/) 또는 모듈러스(%) 연산자의 제수로 0을 사용하면 E_WARNING이 발생하고 false반환되었습니다. 이제 나누기 연산자는 IEEE 754에 지정된 대로 부동 소수점을 +INF, -INF 또는 NAN으로 반환합니다. 모듈러스 연산자 E_WARNING이 제거되었으며 DivisionByZeroError 예외가 발생합니다.
<?php var_dump(3/0); var_dump(0/0); var_dump(0%0); ?> PHP 5에서 위 예제의 출력:
경고: %d 줄의 %s에서 0으로 나누기 부울(거짓)
경고: %d 줄의 %s에서 0으로 나누기 부울(거짓)
경고: %d 줄의 %s에서 0으로 나누기 부울(거짓) PHP 7에서 위 예제의 출력:
경고: %d 줄의 %s에서 0으로 나누기 플로트(INF)
경고: %d 줄의 %s에서 0으로 나누기 플로트(난)
PHP 치명적인 오류: 잡히지 않은 DivisionByZeroError: %s 줄 %d에서 0으로 모듈로 문자열 처리 변경 ¶ 16진수 문자열은 더 이상 숫자로 간주되지 않습니다 ¶ 16진수를 포함하는 문자열은 더 이상 숫자로 간주되지 않습니다. 예를 들어:
<?php var_dump("0x123" == "291"); var_dump(is_numeric("0x123")); var_dump("0xe" + "0x1"); var_dump(substr("foo", "0x1")); ?> PHP 5에서 위 예제의 출력:
부울(참) 부울(참) 정수(15) string(2) "우" PHP 7에서 위 예제의 출력:
부울(거짓) 부울(거짓) 정수(0)
알림: 5행의 /tmp/test.php에서 발견된 잘못된 형식의 숫자 값 string(3) "푸" filter_var() 는 문자열 에 16진수가 포함되어있는지 확인하고 해당 유형의 문자열을 int 로 변환하는데 사용할 수 있습니다 .
<?php $str = "0xffff"; $int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX); if (false === $int) { throw new Exception("Invalid integer!"); } var_dump($int); // int(65535) ?> u{오류가 발생할 수 있습니다 ¶ 새로운 유니코드 코드포인트 이스케이프 구문 의 추가로 인해 리터럴 u{다음에 잘못된 시퀀스가 포함된 문자열 은 치명적인 오류를 일으킬 것입니다. 이를 방지하려면 선행 백슬래시를 이스케이프해야 합니다.
제거된 기능 ¶ call_user_method() 및 call_user_method_array() ¶ 이 함수는 call_user_func() 및 call_user_func_array() 를 위해 PHP 4.1.0에서 더 이상 사용되지 않습니다 . 변수 함수 및/또는 ... 연산자 사용을 고려할 수도 있습니다 .
모든 ereg* 함수 ¶ 모든 ereg기능이 제거되었습니다. PCRE 는 권장되는 대안입니다.
mcrypt 별칭 ¶ 더 이상 사용되지 않는 mcrypt_generic_end() 함수는 mcrypt_generic_deinit() 대신 제거되었습니다 .
또한 사용되지 않는 mcrypt_ecb() , mcrypt_cbc() , mcrypt_cfb() 및 mcrypt_ofb() 함수는 적절한 상수 와 함께 mcrypt_decrypt() 를 사용하기 위해 제거되었습니다 MCRYPTMODE*.
모든 ext/mysql 함수 ¶ 모든 ext/mysql 기능이 제거되었습니다. 다른 MySQL API 선택에 대한 자세한 내용은 MySQL API 선택을 참조하십시오 .
모든 ext/mssql 함수 ¶ 모든 ext/mssql기능이 제거되었습니다.
PDO_SQLSRV PDO_ODBC SQLSRV 통합 ODBC API 국제 별칭 ¶ 더 이상 사용되지 않는 datefmt_set_timezone_id() 및 IntlDateFormatter::setTimeZoneID() 별칭이 각각 datefmt_set_timezone() 및 IntlDateFormatter::setTimeZone() 대신 제거되었습니다 .
set_magic_quotes_runtime() ¶ set_magic_quotes_runtime() 은 별칭 magic_quotes_runtime() 과 함께 제거되었습니다. PHP 5.3.0에서 더 이상 사용되지 않으며 PHP 5.4.0에서 마법 따옴표가 제거되면서 사실상 작동하지 않게 되었습니다.
set_socket_blocking() ¶ 사용되지 않는 set_socket_blocking() 별칭이 제거되어 stream_set_blocking() 이 사용되었습니다 .
PHP-FPM의 dl() ¶ dl() 은 더 이상 PHP-FPM에서 사용할 수 없습니다. CLI에서 기능을 유지하고 SAPI를 포함합니다.
GD Type1 함수 ¶ PostScript Type1 글꼴에 대한 지원이 GD 확장에서 제거되어 다음 기능이 제거되었습니다.
이미지psbbox() 이미지psencodefont() 이미지psextendfont() 이미지psfreefont() 이미지psload글꼴() imagepsslantfont() 이미지pstext() 대신 TrueType 글꼴 및 관련 기능을 사용하는 것이 좋습니다.
제거된 INI 지시문 ¶ 제거된 기능 ¶ 다음 INI 지시문은 관련 기능도 제거되었으므로 제거되었습니다.
always_populate_raw_post_data asp_tags xsl.security_prefs ¶ xsl.security_prefs지시어가 제거되었습니다. 대신 XsltProcessor::setSecurityPrefs() 메서드를 호출하여 프로세서별로 보안 기본 설정을 제어해야 합니다.
기타 이전 버전과 호환되지 않는 변경 사항 ¶ 참조로 새 객체를 할당할 수 없습니다 ¶ 문의 결과를 new더 이상 참조로 변수에 할당할 수 없습니다.
<?php class C {} $c =& new C; ?> PHP 5에서 위 예제의 출력:
더 이상 사용되지 않음: 참조로 new의 반환 값을 할당하는 것은 3행의 /tmp/test.php에서 더 이상 사용되지 않습니다. PHP 7에서 위 예제의 출력:
구문 분석 오류: 구문 오류, 3행의 /tmp/test.php에서 예기치 않은 'new'(T_NEW) 유효하지 않은 클래스, 인터페이스 및 특성 이름 ¶ 다음 이름은 클래스, 인터페이스 또는 특성의 이름을 지정하는 데 사용할 수 없습니다.
부울 정수 뜨다 끈 null true false 또한 다음 이름을 사용해서는 안 됩니다. PHP 7.0에서는 오류가 발생하지 않지만 향후 사용을 위해 예약되어 있으며 더 이상 사용되지 않는 것으로 간주해야 합니다.
자원 물체 혼합 숫자 ASP 및 스크립트 PHP 태그 제거 ¶ ASP 및 스크립트 태그를 사용하여 PHP 코드를 구분하는 지원이 제거되었습니다. 영향을 받는 태그는 다음과 같습니다.
제거된 ASP 및 스크립트 태그 여는 태그 닫는 태그 <% %> <%= %> <script language="php"> 호환되지 않는 컨텍스트에서 호출 제거 ¶ 이전에 PHP 5.6에서 더 이상 사용되지 않는 컨텍스트가 있는 비정적 메서드에 대한 정적 호출은 이제 호출된 메서드에 정의되지 않은 $this변수가 있고 사용 중단 경고가 발생하게 됩니다.
<?php class A { public function test() { var_dump($this); } }
// Note: Does NOT extend A class B { public function callNonStaticMethodOfA() { A::test(); } }
(new B)->callNonStaticMethodOfA(); ?> PHP 5.6에서 위 예제의 출력:
더 이상 사용되지 않음: 비정적 메서드 A::test()는 8행의 /tmp/test.php의 호환되지 않는 컨텍스트에서 $this를 가정하여 정적으로 호출되어서는 안 됩니다. 객체(B)#1 (0) { } PHP 7에서 위 예제의 출력:
더 이상 사용되지 않음: 비정적 메서드 A::test()는 8행의 /tmp/test.php에서 정적으로 호출되어서는 안 됩니다.
주의: 정의되지 않은 변수: 이것은 3행의 /tmp/test.php에 있습니다. 없는 yield 는 이제 오른쪽 연관 연산자입니다 ¶ 수율 구조체는 더 이상 필요없는 괄호 및 간의 우선 순위와 연관 오른쪽 운영자에게 변경된 print와 =>. 이로 인해 동작이 변경될 수 있습니다.
<?php echo yield -1; // Was previously interpreted as echo (yield) - 1; // And is now interpreted as echo yield (-1);
yield $foo or die; // Was previously interpreted as yield ($foo or die); // And is now interpreted as (yield $foo) or die; ?> 괄호를 사용하여 이러한 경우를 명확하게 할 수 있습니다.
함수는 같은 이름을 가진 여러 매개변수를 가질 수 없습니다 ¶ 더 이상 같은 이름으로 두 개 이상의 함수 매개변수를 정의할 수 없습니다. 예를 들어 다음 함수는 다음을 트리거합니다 E_COMPILE_ERROR.
<?php function foo($a, $b, $unused, $unused) { // } ?> 인수를 검사하는 함수는 현재 매개변수 값을 보고합니다 ¶ func_get_arg() , func_get_args() , debug_backtrace() 및 예외 역추적은 더 이상 매개변수에 전달된 원래 값을 보고하지 않지만 대신 현재 값(수정되었을 수 있음)을 제공합니다.
<?php function foo($x) { $x++; var_dump(func_get_arg(0)); } foo(1);?> PHP 5에서 위 예제의 출력:
1 PHP 7에서 위 예제의 출력:
2 Switch 문은 여러 개의 기본 블록을 가질 수 없습니다 ¶ 더 이상 switch 문에서 둘 이상의 기본 블록을 정의할 수 없습니다. 예를 들어 다음 switch 문은 다음을 트리거합니다 E_COMPILE_ERROR.
<?php switch (1) { default: break; default: break; } ?> $HTTP_RAW_POST_DATA 제거 ¶ $HTTP_RAW_POST_DATA 는 더 이상 사용할 수 없습니다. php://input 스트림 대신 사용해야합니다.
INI 파일의 주석 제거 ¶
INI 파일에서 주석 접두사에 대한 지원 이 제거되었습니다. ;(세미콜론)을 대신 사용해야 합니다. 이러한 변화가 적용되는 php.ini 파일 에 의해 처리 파일뿐만 아니라, parse_ini_file () 및 parse_ini_string () .
JSOND로 대체된 JSON 확장 ¶ JSON 확장이 JSOND로 대체되어 세 가지 사소한 BC 중단이 발생했습니다. 첫째, 숫자는 소수점으로 끝나지 않아야 합니다(즉 34., 34.0또는 로 변경되어야 함 34). 둘째, 과학적 표기법을 사용할 때 e지수는 소수점 바로 뒤에 오면 안 됩니다(즉 3.e3, 3.0e3또는 로 변경되어야 함 3e3). 마지막으로 빈 문자열은 더 이상 유효한 JSON으로 간주되지 않습니다.
오버플로 시 내부 함수 실패 ¶ 이전에는 내부 함수가 float가 정수로 표현하기에 너무 큰 경우 float-to-integer 강제 변환에서 생성된 숫자를 자동으로 자릅니다. 이제 E_WARNING이 내보내지고 null반환됩니다.
사용자 지정 세션 처리기 반환 값 수정 ¶ 사용자 세션 핸들러에 의해 구현되는 모든 술어 함수는 반환이 그 중 하나 false또는 -1치명적인 오류가 될 것입니다. 부울 -1, 또는 이외의 이러한 함수의 값 0이 반환되면 실패하고 E_WARNING이 발생합니다.
동일한 요소의 정렬 순서 ¶ 내부 정렬 알고리즘이 개선되어 이전과 동일한 것으로 비교되는 요소의 정렬 순서가 다를 수 있습니다.
참고 :
동일한 것으로 비교되는 요소의 순서에 의존하지 마십시오. 언제든지 바뀔 수 있습니다.
잘못된 break 및 switch 문 ¶ break및 continue외부 루프 또는 문 switch제어 구조는 이제 이전과 컴파일 타임이 아닌 런타임에 감지 및 트리거하고 있습니다 E_COMPILE_ERROR.
Mhash는 더 이상 확장이 아닙니다 ¶ Mhash 확장은 Hash 확장 에 완전히 통합되었습니다 . 따라서 extension_loaded() 로 더 이상 Mhash 지원을 감지할 수 없습니다 . 사용 function_exists () 대신합니다. 또한 Mhash는 더 이상 get_loaded_extensions() 및 관련 기능에 의해 보고되지 않습니다 .