PHP 5 / 7 /8 version 차이점 알아보기

 

PHP 각 버전별 차이점을 알아봅니다.

  • PHP를 사용하며 개발을 진행하다가 어느새 5,7,8버전을 다 사용해 봤습니다.
  • 말이 "사용했다"지, 정작 각 버젼별 차이점이나 향상된 점들을 제대로 숙지하지 못하고 사용하고 있었습니다.
  • 때문에 본 포스팅을 통해서 각 차이점을 알아보고 공부합니다.

 

1.PHP 5.x version

[2005년 11월]php 5.1 version(이하생략)에서는 PHP에서 다양한 DB를 연결할 수 있는 PDO(PHP Data Object)개념이 도입되었습니다.
[2007년 11월] 5.2에서는 JSON타입을 처리할 수 있는 자체함수가 내장되었습니다.
[2009년 6월] 5.3에서는 클래스 로딩을 구분하기 위한 네임스페이스, 익명함수 문법이 추가되었고 메모리 회수를 위한 가비지컬렉터에서 순환참조 문제의 일부가 해결되었습니다.
[2012년 3월] 5.4에서는 상속 없이 클래스들을 모듈화할 수 있는 트레이드 문법을 지원하게 되었습니다. 또한 기본 인코딩이 유니코드에서 UTF-8로 변경되었습니다.
[2013년 6월] 5.5에서는 yield 및 finally 키워드를 지원하게되며, 보안성 강화, 배열 지원 강화 등이 있습니다. 보안상의 문제 때문에 mysqli 및 PDO를 제한 오래된 MYSQL 함수들을 deprecated warrnig으로 지정하게 됩니다.
[2014년 8월] 5.6에서는 $HTTP_RAW_POST_DATA가 비권장 요소로 지정되었고 2GB이상의 파일 업로드가 가능해졌습니다. 또한
지수의 표현을 위해 **연산자가 추가되었습니다.

PHP5가 처음 나온것이 2004년이므로 10년동안 5version을 사용했는데, 2005년부터 PHP 6에 대한 개발이 시작되었지만 취소됨에 따라 PHP 5.x version을 근 10년간 우려먹게 된 것입니다. PHP 6은 처음부터 유니코드 기반으로 작동되도록 설계가 되었지만 이 때문에 대단히 많은 변경점이 예고된바가 있었고, 하필 인코딩으로 UTF-16을 선택한 것이 발목을 잡았다고 합니다.

 

왜냐하면 개발하는 사이에 웹에서 유니코드 인코딩을 UTF-8로 사용하는것이 대세가 되었기 때문입니다. 이때문에 개발에 난항을 겪다가 2010년 5월에 PHP 6 프로젝트는 취소가 되었고 PHP 6에서 논의되던 상당수의 기능만이 PHP 5.4로 흡수되었습니다.

 

UTF-8이 기본 인코딩이 된 것도 PHP 5.4 버전부터 입니다.


엔진이 10년간 바뀌지 않은 채 유지되다 보니 다른 언어보다 속도차이가 크게 나게되고, 보안문제가 드러나며 PHP 5로 장기간 버티는것은 무리로 다가왔습니다. 결국 2014년 PHP 6.x version을 건너뛰고 차기 버전인 PHP 7.x version 개발을 발표합니다. 

 

PHP7.x version(이하 7)은 PHP NG(Next Generation)라는 새로운 구현체가 도입되었고, 덕분에 2015년 6월 배포된 PHP 7알파 1버전은 PHP 56에 비해 약 70%, PHP 5.5와는 거의 2배의 성능향상을 보여 HHVM 못지않은 성능을 보여주었습니다.

 

또한 기존의 PHP 5의 호환성을 최대한 유지한 상태로 새로운 기능을 추가하였기 때문에 많은 혼란은 없었습니다.

 

 

2.PHP 7.x version

[2015년 12월] PHP 7 version이 정식으로 release되었습니다.
- AST 파서가 적용되어 메모리 사용량이 1/5로 감소하였습니다. 
- 객체를 다른곳에 전달할 때 값을 복사하였었는데 7.0부터 참조전달을 하도록 바뀌어 객체에 &를 쓰지 않아도 됩니다.
- 함수의 매개변수에 타입을 지정할 수 있게 되었습니다.
물음표 두 개를 표기하는 Null 연산자가 지원되어 편리해졌습니다.
// 이전 방식
// 삼항연산자로 처리 ? 앞에 값이 있으면 대입하고 없으면 뒤에 것을 쓴다.
$user = (!empty($_GET['user'])) ? $_GET['user'] : '';

// PHP7.0 부터는 같은 표현식이 간단해진다.
// ??(null 병합연산자) 앞에 변수가 없으면 뒤에것을 쓴다.
$user = $_GET['user'] ?? '';

[2016년 12월] PHP 7.1버전 정식 발표되었습니다.
[2017년 11월] 7.2에서 다른 언어처럼 count()함수에 배열에 해당하지 않는 값이 매개변수에 들어갈 때 경고를 합니다.
[2018년 12월] 7.3에서는 Heredoc,Newdoc 문법이 유연해졌고, 함수 호출시 마지막 파라미터 뒤에 콤마를 붙이는 것이 가능해졌습니다.
[2019년 11월] 7.4에서는 프리로딩이 도입되어 최대성능이 8% 향상되었습니다. FFI기능이 생겼는데 외부 함수 인터페이스이며 다른 언어로 컴파일된 dll,so파일의 기능을 php컴파일 없이 바로 사용가능하게 되었습니다.
[2019년 12월] 7.1의 지원을 완전히 종료하였습니다.
[2020년 11월] 7.2의 지원을 완전히 종료하였습니다.
[2021년 12월] 7.3의 지원을 완전히 종료하였습니다.
[2022년 11월] 7.4의 지원을 완전히 종료하며 PHP 7.x의 시대가 지나갑니다.

 

 

3.PHP 8.x version

 

[2020년] PHP 8.0부터 성능 향상을 위한 JIT를 도입, 정의되지 않은 변수 검사 등 예외처리가 강화되었습니다.
- 특히 에러를 일시적으로 감추는ㄴ데 사용되던 @연산자가 사라졌습니다.
- 다른언어에서 옵셔널이라 부르는 Null safe 연산자가 지원되어 프로그램의 안정성이 높아졌습니다.

//아래는 8.0
$country = $session?->user?->getAddress()?->country;
- 다른언어에서 어노테이션이라 부르는 애트리뷰트기능이 지원됩니다.
   ??? : 주석은 사람이 해석하지만 애트리뷰트는 프로그램에게 해당 코드 역할을 지정하는 메타 데이터입니다. 문법은 #[]
class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}
- 함수의 매개변수에 이름을 붙일 수 있게 되었습니다.
htmlspecialchars($string, double_encode: false);
//두번째 인자에 double_encode 이라는 이름이 있어 함수를 내부를 보지 않고도 false가 어떤역할인지 보는데 도움된다.
[2021년 11월] PHP 8.1에서는 드디어 경량 스레드 기능인 Fiber가 RFC찬반투표를 통과하여 도입되었습니다. 코틀린의 코루틴이나 자바스크립트의 async - await와 같은 기능인데 이로서 PHP로도 비동기 프로그래밍이 쉬워지게 됩니다.

그 밖에 타입정리가 이루어졌고 Enum타입이 추가되며 Resource 타입을 삭제, PHP 내장 함수들 타입들이 모두 부여되었고 내장 함수들 Null 허용여부가 타입으로 엄격하게 적용되어 보안이 더욱 향상됩니다.

 

4.PHP 로 작성된 프로그램 목록