Code/PHP

PHP 8의 새로운 기능, 성능 비교

codens 2021. 2. 18. 01:16

< 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



반응형