이 기사에서 공유한 내용은 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에서는 전례가 없는 일이었습니다.
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는 2015년 암호 해시 알고리즘 대회에서 우승한 강력한 해싱 알고리즘이며 PHP 7.2에서는 이를 Bcrypt 알고리즘의 안전한 대체품으로 사용합니다.
새 버전의 PHP에는 PASSWORD_ARGON2I 상수가 도입되었으며, 이제 이 상수는 비밀번호_* 함수 시리즈에서 사용할 수 있습니다:
password_hash('password', PASSWORD_ARGON2I);
하나의 비용 요소만 사용하는 Bcrypt와 달리 Argon2는 세 가지 비용 요소를 사용하여 다음과 같이 차별화합니다.
해시 계산 정의 해당 기간 동안 소비되어야 하는 메모리 오버헤드 양(KiB)(기본값은 1< 인수, 해시 계산에 사용되는 병렬 스레드 수를 설정하는 데 사용됨(기본값은 2)
다음 세 가지 새로운 상수는 기본 비용 요소를 정의합니다.
PASSWORD_ARGON2_DEFAULT_MEMORY_COST
PASSWORD_ARGON2_DEFAULT_TIME_COST
PASSWORD_ARGON2_DEFAULT_THREADS
예는 다음과 같습니다.
$options = ['memory_cost' => 1<<11, 'time_cost' => 4, 'threads' => 2]; password_hash('password', PASSWORD_ARGON2I, $options);
Libsodium은 PHP 코어의 일부가 됩니다
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()을 사용하면 지원 중단 알림이 표시됩니다.
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는 무엇을 의미합니까? 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 4.9.4 PHP 7.2 벤치마크 결과: 148.80 요청/초 ��
위 내용은 PHP 7.2 새로운 기능 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!