>  기사  >  백엔드 개발  >  PHP 7.2 새로운 기능 소개

PHP 7.2 새로운 기능 소개

不言
不言원래의
2018-05-24 14:47:033277검색

이 기사에서 공유한 내용은 PHP 7.2의 새로운 기능 소개에 관한 것입니다. 이는 특정 참고 가치가 있습니다. 도움이 필요한 친구는 이를 참조할 수 있습니다.

PHP 7.2는 2017년 11월 30일에 공식 출시되었습니다. 이 릴리스에는 더 나은 코드를 작성하는 데 도움이 되는 새로운 특징, 기능 및 최적화가 포함되어 있습니다. 이 글에서는 PHP 7.2의 가장 흥미로운 언어 기능 중 일부를 소개하겠습니다.

댓글 요청 페이지에서 전체 변경 목록을 볼 수 있습니다.

핵심 개선

매개변수 유형 선언

PHP5부터 함수 매개변수의 예상되는 선언 유형을 지정할 수 있습니다. 잘못된 유형의 인수가 전달되면 PHP는 오류를 발생시킵니다.

매개변수 유형 선언(유형 힌트라고도 함)은 함수 또는 클래스 메서드에 전달될 것으로 예상되는 매개변수 유형을 지정합니다.

예는 다음과 같습니다.

class MyClass {
    public $var = 'Hello World';
}$myclass = new MyClass;function test(MyClass $myclass){
    return $myclass->var;
}echo test($myclass);

이 코드에서 테스트 함수에는 MyClass 인스턴스가 필요합니다. 잘못된 매개변수 데이터 유형으로 인해 치명적인 오류가 발생합니다.

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8

PHP 7.2에서는 유형 힌트를 객체 데이터에 사용할 수 있으므로 이러한 개선으로 일반 객체 유형을 함수나 메서드의 매개 변수로 사용할 수 있습니다. 예는 다음과 같습니다.

class MyClass {
    public $var = '';
}class FirstChild extends MyClass {
    public $var = 'My name is Jim';
}class SecondChild extends MyClass {
    public $var = 'My name is John';
}$firstchild = new FirstChild;$secondchild = new SecondChild;function test(object $arg) {
    return $arg->var;
}echo test($firstchild);echo test($secondchild);

위 예에서는 테스트 함수를 두 번 호출하여 매번 다른 개체를 전달했습니다. 이는 이전 버전의 PHP에서는 전례가 없는 일이었습니다.

PHP 7.2 새로운 기능 소개

Docker에서 PHP 7.0 및 PHP 7.2에 대한 유형 힌트를 테스트합니다.

객체 반환 유형 선언

변수 유형이 함수 매개변수의 예상 유형을 지정하는 경우 반환 값 유형도 예상 유형을 지정할 수 있습니다.

반환 유형 선언은 함수가 반환해야 하는 예상 유형을 지정합니다.

PHP 7.2부터 반환 유형을 사용하여 객체 데이터 유형을 선언할 수 있습니다. 예를 들면 다음과 같습니다.

class MyClass {
    public $var = 'Hello World';
}

$myclass = new MyClass;function test(MyClass $arg) : object {
    return $arg;
}

echo test($myclass)->var;

이전 PHP 버전에서는 다음과 같은 치명적인 오류가 발생했습니다.

Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10

물론 PHP 7.2 코드는 'Hello World'를 인쇄했습니다.

매개변수 유형 일반화

PHP는 현재 하위 클래스와 상위 클래스 또는 인터페이스의 매개변수 유형 간의 차이를 허용하지 않습니다. 이것은 무엇을 의미합니까?
다음 코드를 참고하세요:

<?phpclass MyClass {
    public function myFunction(array $myarray) { /* ... */ }
}class MyChildClass extends MyClass {
    public function myFunction($myarray) { /* ... */ }
}

여기서 서브클래스의 매개변수 유형을 생략했습니다. PHP 7.0에서는 다음 경고가 생성됩니다.

Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8

PHP 7.2부터 코드를 손상시키지 않고 하위 클래스의 유형을 무시할 수 있습니다. 이 솔루션을 사용하면 모든 하위 클래스를 업데이트하지 않고도 유형 힌트를 사용하도록 라이브러리의 클래스를 업그레이드할 수 있습니다.

목록 구문의 후행 쉼표

PHP 배열의 마지막 요소에 후행 쉼표를 사용하는 것은 올바른 구문이며 때로는 새 요소를 추가할 때 쉼표 누락 오류를 쉽게 방지하기 위해 권장됩니다. 그룹화 네임스페이스의 PHP 7.2부터 후행 쉼표를 사용할 수 있습니다.

RFC 및 일부 예제 코드에 대한 느낌을 얻으려면 목록 구문의 후행 쉼표를 참조하세요.

보안 개선

암호 해싱의 Argon2

Argon2는 2015년 암호 해시 알고리즘 대회에서 우승한 강력한 해싱 알고리즘이며 PHP 7.2에서는 이를 Bcrypt 알고리즘의 안전한 대체품으로 사용합니다.
새 버전의 PHP에는 PASSWORD_ARGON2I 상수가 도입되었으며, 이제 이 상수는 비밀번호_* 함수 시리즈에서 사용할 수 있습니다:

password_hash(&#39;password&#39;, PASSWORD_ARGON2I);

하나의 비용 요소만 사용하는 Bcrypt와 달리 Argon2는 세 가지 비용 요소를 사용하여 다음과 같이 차별화합니다.

  • 해시 계산 정의 해당 기간 동안 소비되어야 하는 메모리 오버헤드 양(KiB)(기본값은 1

  • 다음 세 가지 새로운 상수는 기본 비용 요소를 정의합니다.

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST

PASSWORD_ARGON2_DEFAULT_TIME_COST

  • PASSWORD_ARGON2_DEFAULT_THREADS

  • 예는 다음과 같습니다.

    $options = [&#39;memory_cost&#39; => 1<<11, &#39;time_cost&#39; => 4, &#39;threads&#39; => 2];
    password_hash(&#39;password&#39;, PASSWORD_ARGON2I, $options);
  • Argon2 비밀번호 해시에 대한 자세한 내용을 확인하세요.
  • Libsodium은 PHP 코어의 일부가 됩니다

  • 버전 7.2부터 PHP는 Sodium 라이브러리를 코어에 포함합니다. Libsodium은 암호화, 암호 해독, 서명, 비밀번호 해싱 등을 위한 크로스 플랫폼 및 크로스 언어 라이브러리입니다.
이 라이브러리는 이전에 PECL을 통해 제공되었습니다.

Libsodium 기능 목록은 빠른 시작을 참조하세요.

표준 라이브러리에 최신 암호화를 추가한 최초의 프로그래밍 언어인 PHP 7.2도 참조하세요.

Deprecation

다음은 PHP 7.2에서 더 이상 사용되지 않는 함수 및 기능 목록이며, PHP 8.0 이후에는 모두 제거됩니다.


PHP 5.1의 __autoload 함수는 spl_autoload_register로 대체되었습니다. 이제 컴파일 중에 지원 중단 알림이 보고됩니다.

치명적인 오류가 발생하면 $php_errormsg 지역 변수가 생성됩니다. PHP 7.2에서는 error_get_last 및 error_clear_last를 대신 사용해야 합니다.

create_function() 함수 이름으로 함수를 생성하고 함수 매개변수와 함수 본문을 함수 목록으로 전달할 수 있습니다. 보안 문제와 성능 저하로 인해 더 이상 사용되지 않는 것으로 표시되고 대신 캡슐화가 권장됩니다. create_function() 可以创建一个具有函数名称的函数,将函数参数和函数体作为该函数的列表传入。因为安全问题和性能表现不佳,它被标记为弃用,鼓励用封装替代。

mbstring.func_overload ini 设置为非零值已经被标记为弃用。

(unset) cast 是个总是返回 null 的表达式,并且毫无用处。

如果传入第二个参数,parse_str() 将查询字符串解析到数组当中, 否则解析到本地符号表。 因为安全原因, 不建议 在函数作用域中动态设置变量,使用不带第二个参数的 parse_str() 将抛一个弃用通知。

gmp_random() 是平台相关的,将会被废弃。使用 gmp_random_bits() 和 gmp_random_rage() 代替。

each() 在数组上迭代的行为非常像 foreach(),但 foreach() 基于一些原因而成为更优选择,例如它的速度快上 10 倍。现在在循环中使用前者将会抛出一个废弃提示。

 assert() 函数检查给定的断言,并在结果为 FALSE 的时候进行相关处理。 带有字符串参数的 assert() 现在已经弃用,因为它有 RCE 漏洞。 zend.assertion ini 选项可以关闭断言表达式。

$errcontext

mbstring.func_overload 0이 아닌 값으로 설정된 ini는 더 이상 사용되지 않는 것으로 표시되었습니다.

(unset) 캐스트는 항상 null을 반환하고 쓸모가 없는 표현식입니다.


두 번째 매개변수가 전달되면, parse_str()은 쿼리 문자열을 배열로 구문 분석하고, 그렇지 않으면 로컬 기호 테이블로 구문 분석합니다. 보안상의 이유로 함수 범위에서 변수를 동적으로 설정하는 것은 권장되지 않으며, 두 번째 인수 없이 pars_str()을 사용하면 지원 중단 알림이 표시됩니다. WordPress PHP 7.1 stats

gmp_random()은 플랫폼에 따라 다르며 더 이상 사용되지 않습니다. 대신 gmp_random_bits() 및 gmp_random_rage()를 사용하십시오.

each() 배열 반복은 foreach()와 매우 유사하게 동작하지만 foreach()는 10배 더 빠른 등 몇 가지 이유로 더 나은 선택입니다. 루프에서 전자를 사용하면 이제 지원 중단 메시지가 표시됩니다.

assert() 함수는 주어진 Assertion을 확인하고 결과가 FALSE인 경우 관련 처리를 수행합니다. 문자열 매개변수가 있는 assert()는 이제 RCE 취약점으로 인해 더 이상 사용되지 않습니다. zend.assertion ini 옵션은 어설션 표현식을 끕니다.
  • $errcontext는 오류 발생 시 지역 변수를 포함하는 배열입니다. 오류 핸들러 set_error_handler() 함수의 마지막 매개변수로 사용할 수 있습니다.

    WordPress 사용자에게 PHP 7.2는 무엇을 의미합니까?
  • 공식 WordPress 통계 페이지에 따르면 이 글을 쓰는 시점에서 WordPress 사용자 중 19.8%만이 PHP 7로 업그레이드했습니다. 5%만이 PHP 7.1을 사용합니다. 40% 이상의 사용자가 여전히 PHP 5.6을 사용하고 있으며, 더욱 놀라운 것은 39% 이상의 사용자가 더 이상 지원되지 않는 PHP 버전을 사용하고 있다는 점입니다. 2016년 12월부터 WordPress.org는 PHP 5.6 사용자에 대한 공식 권장 사항을 PHP 7 이상 사용을 권장하도록 변경했습니다.

WordPress PHP 7.1 통계

위의 데이터 성능은 PHP 7이 더 빠른 것 같아서 기분 좋지 않습니다. 다음은 몇 가지 통계입니다.

WordPress benchmarks

PHP 공식 벤치마크에 따르면 PHP 7에서는 시스템이 초당 2개의 요청을 수행할 수 있으며 이는 PHP 5.6에 비해 거의 평균 대기 시간입니다.

  • Christian Vigh는 PHP 성능 테스트 비교도 게시했습니다. 그는 PHP 5.2가 PHP 7보다 거의 400% 느리다는 사실을 발견했습니다.

  • 우리는 2018년에 PHP 5.6, PHP 7, HHVM 성능 벤치마크를 실행했습니다. 위의 벤치마크와 유사하게, PHP 7.2는 PHP 5.6에 비해 초당 트랜잭션(요청) 수의 거의 3배를 수행할 수 있다는 것을 발견했습니다.

  • WordPress 벤치마크
  • WordPress 4.9.4 PHP 5.6 벤치마크 결과: 49.18 요청/초
  • WordPress 4.9.4 PHP 7.0 벤치마크 결과: 133.55 re q/초

WordPress 4.9 .4 PHP 7.1 벤치마크 결과: 134.24 요청/초

Check version of PHP

WordPress 4.9.4 PHP 7.2 벤치마크 결과: 148.80 요청/초 ��

WordPress 4.9.4 HHVM 벤치마크 결과: 144.76 요청/초

많은 것들이 모든 새로운 타사 플러그인과 테마가 제대로 작동하는지 테스트하는 데 시간이 걸리기 때문에 업데이트하는 것이 더 느립니다. 아직 완료되지 않았기 때문에 속도가 느린 경우가 많습니다. 실행 중인 PHP 버전이 무엇인지 모르시나요? 가장 쉬운 방법 중 하나는 Pingdom 도구 또는 Google Chrome 개발 도구를 사용하는 것입니다. 첫 번째 HTTP 요청 헤더에는 일반적으로 버전이 표시됩니다.

PHP 버전 확인

이는 X-Powered-By 헤더의 값을 수정하지 않는 호스트에 의존합니다. 수정된 경우 PHP 버전 정보를 확인하지 못할 수 있습니다. 이 경우 FTP를 통해 파일을 업로드해야 합니다. 아니면 항상 호스트에게 물어보세요.

PHP 7.2로 업그레이드🎜🎜PHP 7.2는 아직 부분적으로 완료되지 않았지만 먼저 사용해 볼 수 있습니다. WordPress 로컬 사이트를 테스트하거나 Docker와 유사한 환경에서 스크립트를 확인할 수 있으며, 명령줄에서 다양한 PHP 버전을 테스트하고 비교할 수 있습니다. 🎜🎜에필로그🎜🎜PHP 7.2로 전환할 준비가 되셨나요? 하지만 적어도 먼저 PHP 7 이상으로 전환하셨기를 바랍니다. 지금 테스트할 준비가 되지 않았다면 스크립트를 업그레이드하고, 코드를 검토하고, PHP 7.2에 대한 첫 경험에 대해 이야기해 보세요. 🎜🎜관련 권장 사항: 🎜🎜🎜Windows 및 극도로 확장된 judy에서 php7.2를 컴파일하세요🎜🎜

Linux에 php7.2를 설치하는 방법

CentOS7yum 설치 PHP7.2 인스턴스 방법

위 내용은 PHP 7.2 새로운 기능 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.