PHP 8의 새로운 기능, 성능 비교
< php 버전별 성능 비교 >
The Definitive PHP 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, and 8.0 Benchmarks (2021)
https://kinsta.com/blog/php-benchmarks/
//-----------------------
php 8 출시 2020/11
en.wikipedia.org/wiki/PHP#Release_history
* 버전별 지원 기간
https://www.php.net/supported-versions.php
- Active 지원 : 출시후 1년
- Security 지원 : 출시후 2년
7.3 : 2018-12 - 2021-12
7.4 : 2019-11 - 2022-11
8.0 : 2020-11 - 2023-11
8.1 : 2021-11 - 2024-11
//--------------------------
* JIT(Just-In-Time) 컴파일
- 0.9~3.0 배 이상 빠른 성능
https://stitcher.io/blog/php-8-jit-setup
- JIT 설정 (php.ini수정)
opcache.enable=1
opcache.jit_buffer_size=100M
//------------------------------
* 명명된 인자 ( Named arguments)
- 함수 호출시 매개 변수명을 지정해서 설정 가능
- PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
- PHP 8
htmlspecialchars($string, double_encode: false);
//--------------------------------
* 속성 (Attributes)
- 구조화된 주석
- 함수, 클래스, 매개변수에 메타데이터를 선언
- Reflection*::getAttributes()을 통해 지정한 속성을 프로그램적으로 가져올수 있음
- 예) Depericated등을 알리는데 사용
https://stitcher.io/blog/attributes-in-php-8
https://php.watch/articles/php-attributes
- PHP 7
/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
function get($id) { /* ... */ }
- PHP 8
#[Route("/api/posts/{id}", methods: ["GET"])]
function get($id) { /* ... */ }
//------------------------------
* 생성자 속성 프로모션 (Constructor property promotion)
- 생성자에서 멤버 변수를 선언과 할당이 가능
- PHP 7
class Point {
public float $x;
public function __construct(
float $x = 0.0,
) {
$this->x = $x;
}
}
- PHP 8
class Point {
public function __construct(
public float $x = 0.0
) {}
}
//------------------------------
* 유니온 타입 - Union Types
- 여러 타입을 중복해서 지정 가능
function get( int|float $number ) { ... }
//------------------------------
* mixed 타입 ( Mixed Type )
mixed는 다음 유니온 타입과 동일
string|int|float|bool|null|array|object|callable|resource
//----------------------------------------
* match 표현식 (Match expression)
- switch 조건문을 간소화
- PHP 7
switch (8.0) {
case '8.0':
$result = "Oh no!";
break;
case 8.0:
$result = "This is what I expected";
break;
}
echo $result;
//> Oh no!
- PHP 8
echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
//> This is what I expected
//------------------------------
* Nullsafe 연산자 - Nullsafe Operator
- null 검사 조건 대체
- PHP 7
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
- PHP 8
$country = $session?->user?->getAddress()?->country;
//-------------------------
* 문자열과 숫자 비교 방식 변경
- 숫자 비교후 숫자를 문자로 변환해서 비교
- PHP 7
0 == 'foobar' // true
- PHP 8
0 == 'foobar' // false
//------------------
* 내부 함수가 타입에러시 예외 오류 발생시킴
- PHP 7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
- PHP 8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
//---------------------------
* 새로운 DOM 탐색 및 조작 API
- PHP 7
$element->appendChild($element->ownerDocument->importNode($elementFromOtherDocument));
$elementFromOtherDocument->parentNode->removeChild($elementFromOtherDocument);
- PHP 8 (위 코드가 다음 처럼 단순화)
$element->appendChild($elementFromOtherDocument);
//-------------------------
* 약한 맵 - WeakMap
- 가비지 콜렉션에서 개체를 참조하는 경우는 그 객체를 해제 할 수 없지만, WeakMap으로 선언하면 해제 가능
class Foo
{
private WeakMap $cache;
public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
//-------------------------
* ::class
객체의 클래스 이름을 가져 오는데에는, get_class() 대신 ::class 사용 가능
$foo = new Foo();
var_dump($foo::class);
//-----------------
fdiv 함수
- 0 으로 나누는 경우 에러가 발생하지 않고 INF, -INF, NAN 중 하나가 반환됨
//--------------------------
* catch 문에서 변수를 생략 가능 (Non Capturing Catches)
-
try{
...
}catch(\Throwable){
//error
}
//-----------------------------
// 참고
https://www.php.net/releases/8.0/en.php
https://kinsta.com/blog/php-benchmarks/
https://php.watch/versions/8.0
https://pronist.tistory.com/60
https://sabjaru.tistory.com/1239