다른 의미에 대한 내용은 PHP(동음이의어) 문서 참고하십시오.
프로그래밍 사이트 선정 프로그래밍 언어 순위 목록 | ||||
{{{#!wiki style="margin: 0 -10px -5px; word-break: keep-all" {{{#!wiki style="display: inline-table; min-width: 25%; min-height: 2em;" {{{#!folding [ IEEE Spectrum 2024 ] {{{#!wiki style="margin: -5px 0" | <rowcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 | 직업 부문 상위 10개 프로그래밍 언어 | ||
1 | Python | 1 | SQL | |
2 | Java | 2 | Python | |
3 | JavaScript | 3 | Java | |
4 | C++ | 4 | TypeScript | |
5 | TypeScript | 5 | SAS | |
6 | SQL | 6 | JavaScript | |
7 | C# | 7 | C# | |
8 | Go | 8 | HTML | |
9 | C | 9 | Shell | |
10 | HTML | 10 | C++ |
}}}
}}}
- [ Stack Overflow 2024 ]
- ||<tablewidth=100%><width=9999><-4><bgcolor=#FFA500><tablebgcolor=#fff,#222> 2024년 Stackoverflow 설문조사 기준 인기 상위 25개 프로그래밍 언어 ||
1 JavaScript 14 Rust 2 HTML, CSS 15 Kotlin 3 Python 16 Lua 4 SQL 17 Dart 5 TypeScript 18 어셈블리어 6 Bash 19 Ruby 7 Java 20 Swift 8 C# 21 R 9 C++ 22 Visual Basic 10 C 23 MATLAB 11 PHP 24 VBA 12 PowerShell 25 Groovy 13 Go
- [ TIOBE 2024 ]
- ||<tablewidth=100%><width=9999><-4><bgcolor=deepskyblue><tablebgcolor=#fff,#222> 2024년 8월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 MATLAB 2 C++ 12 Delphi / Object Pascal 3 C 13 PHP 4 Java 14 Rust 5 C# 15 Ruby 6 JavaScript 16 Swift 7 SQL 17 Assembly language 8 Visual Basic 18 Kotlin 9 Go 19 R 10 Fortran 20 Scratch {{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px);"
{{{#!folding [ 21위 ~ 50위 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"21 COBOL 36 Scala 22 Classic Visual Basic 37 Transact-SQL 23 LISP 38 PL/SQL 24 Prolog 39 ABAP 25 Perl 40 Solidity 26 (Visual) FoxPro 41 GAMS 27 SAS 42 PowerShell 28 Haskell 43 TypeScript 29 Dart 44 Logo 30 Ada 45 Wolfram 31 D 46 Awk 32 Julia 47 RPG 33 Objective-C 48 ML 34 VBScript 49 Bash 35 Lua 50 Elixir
- [ PYPL 2024 ]
- ||<tablewidth=100%><width=9999><-4><bgcolor=green><tablebgcolor=#fff,#222> 2024년 8월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 Objective-C 2 Java 12 Go 3 JavaScript 13 Kotlin 4 C# 14 MATLAB 5 C/C++ 15 PowerShell 6 R 16 VBA 7 PHP 17 Dart 8 TypeScript 18 Ruby 9 Swift 19 Ada 10 Rust 20 Lua
}}} ||
프로그래밍 언어 목록 · 분류 · 문법 |
TIOBE 선정 올해의 프로그래밍 언어 / PHP | |||||
{{{#!folding [펼치기 / 접기] | 2003년 C++ | → | 2004년 PHP | → | 2005년 Java |
#!syntax php
<?php
echo "Hello, world!";
?>
php PHP: Hypertext Preprocessor | |||
<colbgcolor=#787CB4><colcolor=#ffffff> 최초 개발자 | Rasmus Lerdorf | ||
운영 및 개발 | The PHP Group (Zend by Perforce[1]) The PHP Foundation | ||
라이선스 | PHP License | ||
최초 버전 | 1.0 (1995. 6. 8.) | ||
최신 버전 | {{{#!folding 8.1.30 (2024. 9. 26.) | 역대 버전 | |
8.1.0 Alpha 1 | 2021. 6. 10. | ||
8.1.0 Alpha 2 | 2021. 6. 24. | ||
8.1.0 Alpha 3 | 2021. 7. 8. | ||
8.1.0 Beta 1 | 2021. 7. 22. | ||
8.1.0 Beta 2 | 2021. 8. 5. | ||
8.1.0 Beta 3 | 2021. 8. 19. | ||
8.1.0 RC 1 | 2021. 9. 2. | ||
8.1.0 RC 2 | 2021. 9. 16. | ||
8.1.0 RC 3 | 2021. 9. 30. | ||
8.1.0 RC 4 | 2021. 10. 14. | ||
8.1.0 RC 5 | 2021. 10. 28. | ||
8.1.0 RC 6 | 2021. 11. 11. | ||
8.1.0 | 2021. 11. 25. | ||
8.1.1 | 2021. 12. 16. | ||
8.1.2 | 2022. 1. 21. | ||
8.1.3 | 2022. 2. 17. | ||
8.1.4 | 2022. 3. 17. | ||
8.1.5 | 2022. 4. 14. | ||
8.1.6 | 2022. 5. 12. | ||
8.1.7 | 2022. 6. 9. | ||
8.1.8 | 2022. 7. 7. | ||
8.1.9 | 2022. 8. 4. | ||
8.1.10 | 2022. 9. 1. | ||
8.1.11 | 2022. 9. 29. | ||
8.1.12 | 2022. 10. 28. | ||
8.1.13 | 2022. 11. 24. | ||
8.1.14 | 2023. 1. 5. | ||
8.1.15 | 2023. 2. 2. | ||
8.1.16 | 2023. 2. 14. | ||
8.1.17 | 2023. 2. 14. | ||
8.1.18 | 2023. 4. 13. | ||
8.1.19 | 2023. 5. 11. | ||
8.1.20 | 2023. 6. 8. | ||
8.1.21 | 2023. 6. 6. | ||
8.1.22 | 2023. 8. 3. | ||
8.1.23 | 2023. 8. 31. | ||
8.1.24 | 2023. 9. 28. | ||
8.1.25 | 2023. 10. 26. | ||
8.1.26 | 2023. 11. 23. | ||
8.1.27 | 2023. 12. 21. | ||
8.1.28 | 2024. 4. 11. | ||
8.1.29 | 2024. 6. 6. |
- 8.2.25 (2024. 10. 24.)
- ||<-2><tablebgcolor=#ffffff,#2D2F34><tablebordercolor=#ffffff,#2D2F34><tablealign=center> 역대 버전 ||
8.2.0 Alpha 1 2022. 6. 9. 8.2.0 Alpha 2 2022. 6. 23. 8.2.0 Alpha 3 2022. 7. 7. 8.2.0 Beta 1 2022. 7. 21. 8.2.0 Beta 2 2022. 8. 4. 8.2.0 Beta 3 2022. 8. 18. 8.2.0 RC1 2022. 9. 1. 8.2.0 RC2 2022. 9. 15. 8.2.0 RC3 2022. 9. 28. 8.2.0 RC4 2022. 10. 13. 8.2.0 RC5 2022. 10. 27. 8.2.0 RC6 2022. 11. 10. 8.2.0 RC7 2022. 11. 24. 8.2.0 2022. 12. 8. 8.2.1 2023. 1. 5. 8.2.2 2023. 2. 2. 8.2.3 2023. 2. 14. 8.2.4 2023. 3. 16. 8.2.5 2023. 4. 13. 8.2.6 2023. 5. 11. 8.2.7 2023. 6. 8. 8.2.8 2023. 7. 9. 8.2.9 2023. 8. 3. 8.2.10 2023. 8. 31. 8.2.11 2023. 9. 28. 8.2.12 2023. 10. 26. 8.2.13 2023. 11. 23. 8.2.14 2023. 12. 21. 8.2.15 2024. 1. 18. 8.2.16 2024. 2. 15. 8.2.17 2024. 3. 14. 8.2.18 2024. 4. 11. 8.2.19 2024. 5. 9. 8.2.20 2024. 6. 6. 8.2.21 2024. 7. 4. 8.2.22 2024. 8. 1. 8.2.23 2024. 8. 29. 8.2.24 2024. 9. 26.
- 8.3.13 (2024. 10. 24.)
- ||<-2><tablebgcolor=#ffffff,#2D2F34><tablebordercolor=#ffffff,#2D2F34><tablealign=center> 역대 버전 ||
8.3.0 Alpha 1 2023. 6. 8. 8.3.0 Alpha 2 2023. 6. 22. 8.3.0 Alpha 3 2023. 7. 6. 8.3.0 Beta 1 2023. 7. 20. 8.3.0 Beta 2 2023. 8. 3. 8.3.0 Beta 3 2023. 8. 17. 8.3.0 RC1 2023. 8. 29. 8.3.0 RC2 2023. 9. 14. 8.3.0 RC3 2023. 9. 28. 8.3.0 RC4 2023. 10. 12. 8.3.0 RC5 2023. 10. 26. 8.3.0 RC6 2023. 11. 9. 8.3.0 2023.11.23 8.3.1 2023.12.21 8.3.2 2024.1.18 8.3.3 2024.2.15 8.3.4 2024.3.14 8.3.6 2024.4.11 8.3.7 2024.5.9 8.3.8 2024.6.6 8.3.9 2024.7.4 8.3.10 2024.8.1 8.3.11 2024.8.29 8.3.12 2024.9.26
링크 |
[clearfix]
1. 개요
PHP는 대표적인 서버 사이드 스크립트 언어이며 현재는 범용 스크립트 언어를 표방한다. 전 세계 수많은 웹 시스템의 기반이 되는 언어. 비슷한 언어로는 Perl, Ruby 등이 있다. C-like 문법[2]으로 되어 있고, CGI보다 나으며, Perl처럼 배열이 연관 배열이라 자료 구조가 간편하고, 기본적으로 내장된 웹 관련 함수들이 많아 웹 페이지 제작 시 생산성이 높다는 점에서 사용자 및 사용처가 많다. 1995년 라스무스 러돌프가 처음 공개했고, 지금은 The PHP Group에서 개발 및 관리를 맡고 있다.
PHP라는 이름은 원래 Personal Home Page Tools였는데, 지금은 PHP: Hypertext Preprocessor의 재귀 약자를 사용하고 있다.
워드프레스, 미디어위키 등의 많은 애플리케이션이 PHP로 작성되어 있다. 웹서핑을 하다 보면 쓰는 곳이 많다는 걸 발견할 수 있다. 한국에서 점유율이 높은 CMS인 라이믹스, 그누보드(영카트), 그리고 중견, 개인 쇼핑몰과 디시인사이드 등 인터넷 커뮤니티, 언론사 등 대다수 웹사이트들이 PHP로 제작되어 있다.
2. 특징
PHP는 Perl 언어의 영향을 많이 받았는데, 변수 이름 앞에 $를 붙이는 것(예: $var), 펄처럼 배열이 연관 배열로 작동하는 것, 문자열끼리 결합할 때 점(.) 연산자로 결합하는 것이 그 예이다. (예: "Hello, " . "world!" = "Hello, world!"). 다른 프로그래밍 언어에서 하던 대로 더하기 기호(+)로 문자열을 결합하려 하면 엉뚱한 결과가 나온다. PHP에서는 +는 오직 숫자 덧셈만 하기 때문이다. 따라서 두 문자열에 +를 사용하면 두 값이 숫자 0 으로 형변환되어 잘못된 결과가 나온다. (예: "Hello, " + "world!" = 0)PHP의 큰 특징 중 하나는 무상태성(Stateless)으로, HTTP 프로토콜과 마찬가지로 상태를 유지하지 않는 성질이다. PHP 웹 서버에 요청을 하면, 해당 스크립트를 실행한 뒤 완전히 종료하고, 그 다음 새 요청이 들어오면 처음부터 시작하는 방식이다. 이 때문에 PHP에서 싱글톤 패턴을 구현하면, 객체는 한 요청에 의한 작업이 끝날 때까지만 유지된다. 이러한 특성으로 인해 메모리 관리가 쉽고, 사용자(브라우저 요청, cli 입력등)가 잘못된 입력을 해서 오류가 났을 때 개별적으로 처리하게 되므로 안전하지만, 상태를 유지할 수 없기에 기본 배포되는 PHP로는 DB 커넥션 풀을 만들 수가 없다.[3]
PHP 는 다른 스크립트 언어와 달리 실행 중에 타입을 체크한다. 타입들이 점차 추가 되었으며 php 7 이후로 declare(strict_types=1)을 선언하면 강타입으로 작동한다.
PHP 파일은 <?php ... ?>로 이루어진 스크립트 실행 영역이 있다. <? ... ?>는 권장하지 않는다. 이렇게 줄여 쓰는 방식은 비활성화되어 있는데 사용하려면 php.ini에서 short_open_tags 설정을 on으로 바꾸어야 한다. 비활성화되어 있는 이유는 XML과 같은 문법과 충돌했기 때문이다. PHP가 처음 나왔을 때는 HTML만 있었기 때문에 줄여 쓰는 방식이 문제가 없었지만, HTML에 XML의 문법을 도입한 XHTML 1.0이 나오면서 충돌이 일어났고, 결국 저 옵션이 기본적으로 꺼져 있도록 변경된 것. 다행히 HTML5에서는 XML 문법이 빠졌다. 변수 하나만 출력한다면 <?=$var?> 형태로 줄여 쓸 수도 있다. 원래 short_open_tags 설정값이 off라면 이것도 같이 꺼졌지만, PHP 5.4부터는 short_open_tags 설정값에 상관없이 항상 <?=$var?> 형태로 쓸 수 있게 되었다.
아주 옛날에는 WYSIWYG 기반 에디터를 사용할 때 <?php ... ?>로 이루어진 스크립트 실행 영역을 올바르지 않은 태그로 잘못 인식하는 문제를 회피하기 위해 <script language="php"> ... </script>[4] 태그를 사용하기도 했다. 그렇지만 이 태그는 JavaScript에서 쓰는 것과 혼동될 수 있어서 PHP 7부터 삭제되었다.
PHP 위원회는 새 버전의 기능을 RFC 문서로 제안받고, RFC에 올라온 사항들을 찬반 투표에 부쳐 찬성이 2/3을 넘길 경우 기능을 추가한다. 레딧, PHP 메일링 리스트 등에서 토론이 이루어진다. 새 기능 RFC 제안 사항 찬반 투표 진행과 결과를 공개하는 사이트.
PHP는 오픈 소스이며 포팅된 곳이 많아 거의 모든 웹 서버에서 실행할 수 있다. 유닉스(리눅스), 윈도우, macOS 모두 지원한다. PHP 공식 사이트에서는 소스 코드를 공개하고 있고, 리눅스 등의 유닉스 계열 OS에서 컴파일하는 방법을 알려주고 있다. 대부분의 경우 직접 컴파일을 할 필요는 없는데, 유명 리눅스 배포본의 공식 저장소에는 PHP 설치 패키지를 기본으로 제공하기 때문이다. 만약 없다면 Packagist 같은 패키지 저장소(repository)에서 각 OS의 환경에 맞는 PHP 설치 패키지를 찾을 수 있다. 별도의 저장소를 추가하면 버전도 입맛대로 설치할 수 있다. PHP 5.5 버전부터 64비트 버전이 나왔다. 윈도우용은 PHP 공식 사이트에서 직접 실행 파일로 만들어서 제공한다. 윈도우용의 경우 동작 방식의 차이 때문에 IIS 및 NGINX에서 돌리는 PHP는 Non-Thread Safe 버전으로, 아파치에서 돌리는 PHP는 Thread-Safe 버전으로 따로 나온다. 맥 OS에는 이미 설치가 되어 나오는데, 더 최신 버전을 설치하고 싶으면 맥 OS의 패키지 관리자인 Homebrew(홈브루)를 통해서 설치할 수 있다.
2.1. 장점
- PHP는 C언어로 CGI를 이용해 웹서버를 만드는것 보다 배우기 쉬웠고, 사용자에게 보여지는 HTML 페이지의 템플릿을 지원해서 쉽게 웹서버를 만들 수 있었으며, 웹 개발에 필요한 관련 함수들이 내장되어 있어서 개발 생산성이 뛰어나서 사용자가 급격하게 늘어났다.
- PHP는 무상태성이다 (Stateless) 무상태성의 장점은 요청할 때마다 새로 시작하기 때문에 배포가 편해지고, 오류에 대해 덜 민감하다. 예를 들어 다른 언어로 작성한 서버는 어떤 사용자가 잘못된 요청을 보내서 프로그램이 실패하면 해당 서버가 멈추게 되어 재부팅이 필요할 상황이 올 수도 있는데, PHP는 새 요청이 왔을 때 프로그램을 처음부터 시작하므로 사용자가 올바른 요청을 보내면 정상 작동한다. 오류를 개별적으로 처리하는 것이다. 그리고 매번 종료를 하게됨으로서 메모리 누수를 방지한다. 가비지 컬렉터도 PHP 5.3 부터 도입되었다.
- PHP는 간편하게 서버에 올릴 수 있다. PHP 인터프리터에서 PHP 파일을 실행할 때마다 파일 내용을 확인 후, 바뀐 부분이 없으면 캐시파일[5]을 실행하고, 바뀐 부분만 해석한 뒤 다시 캐시로 저장하는 방식이라 업로드만 하면 되니까 간편하다.
- 위의 특징들로 인해 프로젝트가 커지면 빌드시간이 늘어나는 다른 언어들과 달리 PHP는 개발이나 배포할 때 빌드가 필요 없다.
2.2. 단점
- 전체적으로 잘 설계된 언어는 결코 아니다. 예를 들어 내장함수나 인자 이름 규칙에 일관성이 부족하다. 라스무스가 처음 PHP를 만들 당시에는 템플릿 언어로 시작했다가 PHP 2.0 이후에 본격적인 프로그래밍 언어로 바뀌었기 때문이다. 기본적인 이름은 C언어 함수에서 가져오고, 그 이후 다른 함수들이 추가되었는데, 그러다보니 이름규칙과 분류가 제대로 되어있지 않았다. 이것 때문에 많이 까였다. 7.0 이후에는 계속 버전업하면서 바뀐 이름 규칙에 맞게 수정한 함수를 지원하는 등[6] 점차 나아지는 추세다.
- PHP 의 장점이자 단점인 무상태성을 단점 측면에서 보면 PHP는 사용자 요청 후 종료되기 때문에 프레임워크처럼 한번 띄워두고 사용해야 되는 것들도 매번 로딩되어 성능에 영향을 끼친다.[7] PHP 프로세스는 수천 회 재활용되지만 개별 요청에서 사용자의 프로그램이 초기화되므로 위의 상황은 그대로라고 할 수 있다. 때문에 PHP 프로그램이 종료되지 않게 만드는 swoole, 로드러너, 프랑켄 PHP 등을 사용하면 성능이 대폭 향상되는데 PHP 코드를 바꾸거나 관련 라이브러리를 설치해야 하고 간편한 배포를 포기해야 한다.
- 오류를 숨기고 실행되는 방법이 기본값인 경우가 많다. 대표적인 예로 골뱅이(@) 연산자가 있는데, 이 연산자는 오류를 숨기고 코드를 실행하도록 설계되었다. 과거 PHP가 템플릿 엔진으로 시작되었을 때는 오류를 로그 파일이나 터미널보다는 브라우저 화면에 표시하는 것이 일반적이었기 때문에, 오류 발생 시 화면이 멈추는 문제를 해결하기 위해 @ 연산자가 임시방편으로 사용되었다. 많이 지적받아서 PHP 8 부터는 @의 역할이 축소되었다. PHP의 또 다른 단점은 MySQL 연결에서 오류 처리가 비직관적이었다는 것이다. PHP 8.1 이전에는 MySQL 연결 오류가 기본적으로 숨겨졌으며, 이로 인해 디버깅 과정이 어려웠다. PHP 8.1부터는 기본 동작이 변경되어 오류가 즉시 발생하도록 되어 디버깅이 더 쉬워졌지만, 이전 버전에서는 mysqli_report 함수에 MYSQLI_STRICT 옵션을 수동으로 설정해야만 제대로 된 오류 처리가 가능했다.[8] PHP로 개발할 때는 숨겨진 기본값들을 수동으로 수정하고, 다양한 디버깅 옵션을 활성화한 후 디스플레이 에러를 끄고 로깅과 xdebug와 같은 디버깅 툴을 사용해야만 다른 언어에서 제공하는 개발 환경과 비슷한 수준을 만들 수 있다. mysqli_report, PDO면 error_mode 등 설정을 전부 마쳐서야 다른 언어의 개발 환경과 비슷해진다. PHP 프레임워크들은 세팅값들이 적용되어있고 스택 트레이스를 알려주는 등 개발환경이 정상적인 편이다. 물론 프레임워크 없이도 가능하지만 좀 복잡한 편.
2.3. PHP 7.4 이하 버전 단점
- 정의되지 않은 변수(undefined)를 쓸 수 있었다. 다만 이 단점은 최근 버전에서 해결되었는데, PHP 8.0부터는 인터프리터 알림에서 경고로 상향했다. PHP 9.0부터는 정의되지 않은 변수를 쓰면 파싱에러가 나고 쓸 수없게 한다.(즉, 프로그램 실행 불가). 정의되지 않은 변수를 쓰는 것이 단점인 이유는 없는 변수를 써도 무시하기 때문에 개발자가 실수를 하게되기 때문이다.
- 옛날 버전들은(PHP 7.4까지) 정의되지 않은 변수를 사용했다는 알림만 보여줬다. 알림은 에러 설정을 E_ALL로 해놔야 표시된다.[9] 느슨한 ==가 아닌 ===을 쓰더라도 같다는 결과가 나온다. 이를 확인하려면 get_defined_vars 함수(지역 변수) 또는 $GLOBALS 변수(전역 변수) 등을 통해 선언된 변수의 목록 배열을 얻어온 다음, 그 배열에 변수가 포함되어 있는지를 확인해야 한다. 그러나 null과 구분되지 않는 특성을 이용해 일반적으로 php 코드에서는 isset 함수로 체크한다.
- 오류와 예외처리가 일관되지 않다 PHP 8버전등 최근버전에서 고치고있으나 그이전 버전을 보면 예외처리해야할 요소에 그저 E_WARNING 등의 경고만 내서 프로그램안에서 해당오류를 컨트롤 할 수없는 것들이 많았고 false를 리턴 하는게 많았다.
- PHP 5.X 대는 현재 PHP 의 나쁜이미지를 쌓는 시기였다. 버전이 정체되어 느리고 이상한 동작도많고 타입도 부여되지 않았으며 특히 PHP 5.4.X는 보안에 문제가 많았는데 register global 문제가 있었다.[10] 하지만 PHP 5.X대가 오랫동안 유지되어 아마존, 페이스북을 비롯한 PHP를 사용하던 대다수의 기업들이 PHP 5.2 ~ 5.5 시기에 빠져나갔다.
2.4. 다른 웹 서비스 개발 기술과의 비교
종종 Java 진영의 JSP와 비교되기도 했었다.한국의 SI 업계에서는 JSP 개발자로 넘어가는 일이 많았는데, 공공기관 프로젝트를 따내려면 정부에서 만든 자바 기반의 전자정부프레임워크를 써야 가산점을 받아 유리해지기 때문이다. 민간의 대규모 서비스는 PHP 5버전 시절 OOP 지원 미흡했을때 유지 보수성 등을 이유로 Java 기반을 요구하는 경우가 많았다.
일본이나 유럽 특히 프랑스에서는 PHP를 많이 쓰고 있다.[11]
2023년 현재에는 다음과 같은 기술들이 전 세계 웹 서비스 개발에 주로 사용되고 있다.
- Java 진영의 Spring(프레임워크)
- Ruby 진영의 Ruby on Rails
- Python의 Django, Flask, FastAPI 등
- JavaScript를 사용하는 Node.js 진영의 Express,AdonisJS NestJS 등
- C#의 .NET , ASP.net 주로 북미에서 쓰인다
- PHP는 라라벨이 주로 쓰이며, 두번째로는 심포니이다.
3. 레거시와 현대화
2000년대 초반 국내에서는 네이버도 PHP를 사용했다. 그 당시 PHP는 구동 속도도 느린데다 객체지향을 지원하지 않았기 때문에 협업이 힘들다는 이유로, 2000년대 중반 Java 계열의 JSP나 C# 계열의 ASP.NET으로 옮겨갔다. (PHP에서 제대로 된 객체지향이 등장한 것은 2009년 발표된 PHP 5.3부터이다). 페이스북은 이전에는 PHP를 주 언어로 사용하다가 2014년 자사에서 PHP 기반으로 개발한 hack이라는 언어를 사용한다.[12]과거 PHP에서는 MVC 패턴[13] 적용이 어려웠지만, PHP 5.0부터 객체지향 프로그래밍 요소가 들어가기 시작했고, 5.3 에 네임스페이스가 도입 되면서 객체지향과 MVC 패턴으로 설계된 프레임워크들이 더 많이 개발되었다. 그러나 오래된 CMS들[14] 은 보안에 취약하게 작성되어 있었고, 그 밖에도 소규모 프로젝트에서는 관리가 힘든 경우가 많았다. 예를 들어 제로보드는 SQL 쿼리에 들어갈 변수들에 "준비된 실행문"(Prepared Statement)이라는 안전한 방식을 사용하지 않았는데, 그 결과 SQL 인젝션 공격을 받아 뽐뿌 개인정보 해킹 사건 등이 발생했다. 반면 2013년 출시된 XE의 경우 시작부터 MVC 아키텍쳐 구조였으며 SQL 인젝션 문제를 설계변경으로 근본적으로 해결하였고, 드루팔의 경우는 2015년 드루팔 8 부터 컴포저를 지원하고 개발이 쉬운 패키지 모듈로 개선되었다.
3.1. 모던 PHP
2000년에 나온 PHP 4까지는 클래스가 있어도 없는 것이나 다름없었고 순수하게 스크립트 형태로 작성된 코드들이 많았는데, PHP 5.3 이후로는 점점 객체 지향 프로그래밍이 사용되기 시작했다.[15]. 그래서 5.2 버전까지를 고전 PHP, 5.3 ~ 5.6 5년간을 과도기, 7.0 이후 버전은 현대 PHP로 분리해서 보는 시각이 있다.2023년 워드프레스 통계에서도 PHP 5.6 이하는 점유율이 5% 이하로 떨어지는 등[16] 이제는 모던과 모던아닌것을 구분해야되는지 의문이다.
PHP 프레임워크들이 등장하면서 MVC 아키텍쳐 등이 적용되어 협업관련 문제는 대부분 해소되었고, PHP 7부터는 좀 더 확실한 OOP 언어에 가까워졌다. PHP 의 좋지않은 인식에 영향끼친 대다수는 5.2 버전 대에서 벗어나지 못하는 절차지향적으로 작성된 일부 CMS들과 [17] 여기에 익숙해져 새로운 것을 배우지 않는 cms 만 다루는 사용자들이 원인이다. PHP Framework Interop Group에서 제안한 PSR 규칙[18]으로 인해 많은 프레임워크가 정형화되었다. 요즘 PHP 개발에서는 PSR을 지키는 것이 권장된다.
PHP는 느슨한 타입 검사와 extract() 로 변수 생성하기등 보안 취약점이 지적되었다. 타입 강화는 PHP 7부터 개선된 부분이 있지만, 초창기부터 이어져 온 특유의 함수 이름 비일관성은 여전히 고쳐나가는 중이다. PHP 8.1부터는 보안문제로 지적받던 $GLOBALS 배열에 쓰기 작업하는것이 금지되었다.
흔히들 모던PHP 라고하는건 네임스페이스가 도입된 PHP 5.3 버전인데 이전까지는 제대로 된 디자인 패턴이나 프레임워크가 확립되지 않았고,[19] 이로 인해 보안 따위는 가볍게 날려버린 코드를 짜는 방법들이 있어서 그걸 쓰는 개발자들이 많았는데, "PHP는 안전하지 않다"라는 이미지를 심는 데 일조하였다. 결론을 말하자면, 개발자가 보안에 대해 인지하고 방어하는 코드를 쓰자는것 . 요즘에는 CMS도 프레임워크 사용으로 보안 문제가 상당히 줄었다.
웹에 올라와 있는 PHP 비판 문서는 유심히 봐야 한다. 잘못된 내용을 적을 때도 있고, 현시점에서 해결된 문제도 떡하니 올려놓는 경우도 많다. 2015년 7.0이 나오기 이전 당시 버전인 5.x 시절에 작성된 글이 많다. 특히 PHP: 잘못된 디자인의 프랙탈의 번역본이 퍼져 있는데, 이 글은 2012년에 작성되었고 PHP 5.4 버전 시점의 이야기 이다. PHP 7.0 에서 해당 글에 나온 많은 결함이 수정되었다. 2017년에 슬랙에서 작성한 PHP의 장점과 단점 PHP에 대해 진지하게를 참고하는 편이 낫다. 물론 이것 마저도 PHP 8.0에서 몇가지 개선되었다.
다른 언어 플랫폼처럼 모듈등 생태계를 지원하기 위해 Composer라는 의존성 관리 도구가 나와 패키지 구성과정을 간소화 할 수 있게 되었다. PHP 라이브러리는 패키지스트에서 찾을 수 있다. https://packagist.org
4. 구동방식
- PHP는 아래와 같은 과정으로 구동 된다.
- 사용자가 웹을 통해 요청하면 (터미널에서 입력시 3번으로)
- 웹 서버는 PHP 의 SAPI 인터페이스를 통해 요청을 한다 PHP 프로세스 풀에서 기존 프로세스를 찾거나 생성을 한다
- PHP 엔진에서 해당 파일의 opcode(실행 코드)캐시가 있는지 확인한다.
- PHP 8.0부터 JIT 기능을 켰을때는 opcode를 JIT에서 바이너리로 컴파일한다. 이때는 PHP VM을 건너띄고 실행한다.
- opcode 캐시가 없으면 PHP 파일을 opcode로 컴파일 한다. 있으면 opcode를 실행하는데 PHP VM을 통해 실행한다.
- 사용자의 요청을 수행
- 사용자 프로그램이 종료된다. 종료되면서 모든 객체와 변수등이 메모리에서 삭제된다. [20]
- 이하 반복
- PHP VM은 리눅스에서 1프로세스당 1엔진이며, PHP 설정에 따라 1 ~ N번의 사용자 요청을 수행한 다음에 웹서버 프로그램의 프로세스 관리에 따라 프로세스가 종료 후 다시 생성된다.[21]
- 윈도우 서버의 IIS NTS 모드와 리눅스에서 TS 방식은(위에 기술한 것) 조금 다른데 자세한 내용은 PHP intenals Books에 나와있다.[22][23]
- PHP 문법에는 각종 타입들이 있는데, 실행중에 체크한다 (런타임 체크).[24][25]
- 페이스북은 자사 서비스를 개발하다가 당시 PHP의 성능 문제를 해소하기 위해 오픈 소스로 HipHop for PHP와 HipHop Virtual Machine(HHVM)을 개발했다. 전자는 PHP 코드를 C++ 코드로 변환한 뒤 컴파일하는 방식이고, 후자는 Java와 비슷하게 JIT 컴파일링을 하는 방식이다. 현재 HipHop for PHP는 개발을 중단하고 HHVM만 개발하여 내놓고 있다. 참고로 페이스북은 HHVM을 개발하면서 hack이라는 프로그래밍 언어도 만들었는데, hack 언어로 작성한 코드는 HHVM으로 실행한다.
- PHP 7.0에서 인터프리터 문법 파서를 재작성 했는데, AST 파서를 도입해서 HHVM의 강점인 속도를 따라잡았다. 2020년 말에 출시된 PHP 8부터는 인터프리터에 JIT을 도입하여 JIT 구동 여부에 따라 7.4 대비 2배의 성능 향상이 있다. (벤치마크 ) JIT은 위에 실행과정 설명 중 4번의 opcode를 기계어로 컴파일을 하기 때문에 php 엔진에서 opcode를 인터프리트 할 때보다 보다 빨라지는 것이다.
- PHP-FPM 은 웹 서버 프로그램[26]과 통신하는 모듈 형태이다. PHP로 HTTP/2를 지원하기 위해서는 PHP-FPM으로 구동해야 한다.
5. 개발 환경
옛날에는 에디트 플러스나 노트패드++ 같은 단순 편집기를 쓰고 통합 개발 환경(IDE)을 안 쓰는 사람도 있었지만, 배포 전에 오류를 잡고 개발 생산성을 높이기 위해서는 IDE를 쓰는 것이 좋다.영어로는 IDE(Integrated Development Environment)라고 한다. 터미널, 디버거, 확장(Extension), 코드 편집기 등 개발에 도움울 주는 각종 기능들이 담겨 있는 앱을 가리킨다. IDE는 작업 중인 코드 상의 문제를 추적해 주거나 스타일 수정을 해 주는 패키지와의 연동을 통해 GUI 상에서 코드 퀄리티 관리를 자동으로 해 주는 편리한 기능도 제공한다.
VS Code 같은 텍스트 에디터에 디버깅을 위한 Xdebug를 설치해서 사용하는 방법도 있다. 특히 VS Code는 MS가 전폭적으로 밀어주고 있어 각종 플러그인의 숫자도 늘어나는 중이다.
IDE 중에는 넷빈즈와 JetBrains사에서 개발한 유료 IDE PhpStorm이 편리한 코드 에디터, 각종 프레임워크 지원, DB 관리 통합, 신속한 지원에 힘입어 점유율을 늘려가고 있다. PhpStorm은 PHP뿐만 아니라 JavaScript, TypeScript, CSS지원 등 웹스톰의 기능들까지 전부 포함하고 있다.
5.1. 웹 프레임워크
프레임워크란 개발의 방향성을 잡을 수있게 도와 주는 틀이 되는 소프트웨어다. 웹에서는 주로 MVC 아키텍처를 많이 쓴다.- 라라벨: 첫 등장 이후 PHP 프레임워크 중에서 인기 많고 점유율이 높은 프레임워크이다. 루비온 레일즈 설계에 영향을 받은 프레임워크이며 개발이 활발히 이루어지고 있다 심포니 프레임워크의 모듈도 포함되어 있다.
- CakePHP: 일본의 루비온레일즈에 영향을 받아서인지 일본에서 가끔쓰인다 2018년쯤 들어서 쓰지않는 추세다. 거의다 라라벨로 갈아타는 추세
- CodeIgniter(코드이그나이터) : MVC 패턴이 있으나 3버전까지는 REST API지원이 되지않고, PHP 5.2를 지원하기위한 하위호환성 때문에 클래스설계, 로딩방식에 제약이 심하다. 4 버전 이후로는 PHP 7 문법으로 다시 작성되었고 PSR 규칙이 몇 가지 적용되어 약간이나마 나아진 모양. 그러나 코드이그나이터터 제작자 측에서 PSR 규칙을 모두 따르지 않겠다고 해서 라이브러리 사용에 제약이 있긴하다.
- Symfony: 2005년 프랑스 개발자가 만든 심포니는 자바 진영의 스프링프레임워크의 설계에 영향받아 모듈화가 잘 되어있는 프레임워크이다. 공식 validation 스펙마저 자바의 JSR 명세를 따를 정도이다. 유럽, 특히 프랑스에서는 점유율이 아주 높다.
- Slim Framework : REST API에 특화된 프레임워크로 주로 API 라우팅용으로 쓰인다.
- Reasonable
- phalcon: C 익스텐션으로 개발된 풀스택 PHP 프레임워크. PHP에서 변형된 독자언어를 써야한다.
- zend
- FuelPHP
- Yii
- PHPixe
5.2. 각종 ORM
ORM 이란 SQL 쿼리를 사용하지 않고 DB 작업을 객체지향적으로 할 수 있게 도와주는 개념이다. 물론 만능은 아니라서 복잡한 DB작업은 SQL을 써야 할 경우도 있고 기본적으로 DB를 잘 알아야 한다.ORM 구현 라이브러리
- Eloquent 엘로퀀트 ORM: 라라벨의 기본 ORM 이며 라라벨 없이 분리해서 사용하는것도 가능하다. 루비온레일즈의 ORM처럼 엑티브레코드 패턴이다.
- 독트린 ORM: 자바의 JPA처럼 데이터 맵퍼패턴으로 설계되었다.
- 그밖에 RedBean ORM 등이 있다.
5.3. 디버깅
- PHP 에는 5.4 버전부터 디버깅 도구인 phpdbg 가 내장되었다 그렇지만 기능이 더욱 풍부한 xdebug를 설치해서 사용하는것이 일반적이다.
- xdebug 는 PHP 지원버전과 TS/NTS 여부에 따라 설치해서 쓴다.[27] Xdebug를 설치하면 다른 프로그래밍언어와 마찬가지로 원격디버깅이나 브레이크포인트를 찍고 실행흐름에 따라 변수들을 살펴보면서 디버깅이 가능하다. 다만 실서버에 설치하면 느려지므로 개발서버나 개발하는 컴퓨터에서만 사용하는것을 권장한다.
5.4. 패키지 관리자
PHP 의 패키지관리자는 3가지가 있는데 PECL , Phar , 컴포저(Composer)이다. PECL, Phar 은 PHP 익스텐션 관리자이다. c 나 c++ 등으로 만든 익스텐션들이 있다. 이 중에 PHP만 다루는 것은 컴포저다. 컴포저는 php프로그램을 배포하는 패키지스트 사이트에 다운/배포를 하며 해당 php 프로그램에 필요한 라이브러리들을 관리한다 이를 의존성 관리라고 한다.5.5. 익스텐션
- PECL(The PHP Extension Community Library, 피클이라고 읽는다.) PECL은 속도향상을 위해 C언어 , C++ 등으로 작성된 PHP 익스텐션들을 다운받고 만든 것을 배포하는 곳이다. PECL에 패키지를 올리려면 몇 가지 절차가 있는데 해당 익스텐션의 사용법을 php.net의 공식 문서에 올려야한다. 가끔 PHP 내장함수도 아닌데 공식문서에 설명이 올라와 있는 것은 이 때문이다.
- 예전에 PECL에서 인기있던 라이브러리가 PHP 새 버전에서 통합되는 경우도 있었다. PHP 5.2의 json , PHP 5.5의 opcache 등이 해당 경우다.
6. 문법
자세한 내용은 PHP/문법 문서 참고하십시오.7. PHP 코딩 표준안
PHP 5.3 이후 PHP 진영에도 프레임워크들이 나오면서 코딩표준과 프레임워크들 호환에 관해 PHP 프레임워크 그룹에서 규칙을 정했다.- PSR 한국어 번역문서
PSR 0 ~ 17가 있는데 PSR 4와 12가 주요 규칙이고 PSR 4는 PHP 클래스를 자동으로 불러오는 '오토로드' 기능이며 Node.js의 NPM과 같은 패키지 의존성 관리자인 컴포저의 기능 중 하나이다. - PHP The Right Way 한국어 번역문서
그리고 PHP The Right Way라는 문서가 인정받고 있다.
8. 업데이트
PHP의 공식 업데이트는 7.0이 나온 이후로 최신 버전 및 하위 2개 버전까지만 업데이트를 유지한다. 예를 들어 8.3이 나오면 8.2과 8.1는 업데이트를 지속하고, 8.0은 업데이트를 종료하는 형식이다. 그러나 많이 쓰이는 몇몇 리눅스의 배포판(대표적으로 레드햇 리눅스와 우분투)은 PHP의 업데이트가 종료된 이후에도 자체적으로 계속 보안 업데이트를 지원한다. 이런 유명 배포판들은 보통 서버용으로 써서 지원 기간이 길고(특히 LTS로 부르는 장기지원 버전), 호환성을 위해 해당 메이저 버전 내의 공식 저장소 PHP 버전을 바꾸지 않기 때문에 자체적으로 보안 업데이트를 지원하는 것이다. 그렇더라도, 보안이 강화된 최신 버전을 쓰는 것이 좋다.8.1. PHP 5
- 2005년 11월 5.1 PHP 에서 다양한 DB를 연결할수있는 PDO(PHP Data Object)가 도입되었다. PDO를 사용함으로서 DB 쿼리에 prepared statement(준비된 쿼리 구문)를 사용하여 안전하게 되었다.
- 2007년 11월 5.2 JSON을 처리할 수 있는 함수가 내장되었다. Mysqli 도 PDO 처럼 prepared statement 쿼리 지원이 추가되었다.
- 2009년 6월 5.3 객체지향에서 클래스파일 위치를 구분하기 위한 네임스페이스, 익명함수 문법이 추가되고 메모리 회수를 위한 가비지컬렉터에서 순환 참조 문제가 일부 해결되었다.[28]
- 2012년 3월 5.4 업데이트된 기능[29]이 다른 언어에선 이미 지원되는 것들이었다.[30] 그리고 상속 없이 합성을 통한 클래스들을 모듈화할 수 있는 트레이트 문법을 지원하게 되었다.
- 2013년 6월에 5.5가 배포되었다. yield 및 finally 키워드 지원, 보안성 강화, 배열 지원 강화 등을 골자로 하고 있다. 보안상의 문제 때문에 mysqli 및 PDO를 제외한 오래된 MySQL 함수는 비권장(deprecated) 요소였다가 PHP 7에서는 완전히 제거되었다.
- 2014년 8월에 5.6이 배포되었다. $HTTP_RAW_POST_DATA가 비권장 요소가 되었고 PHP 기본 스트림으로 대체하기로 했다. 2GB 이상의 파일 업로드가 가능해졌다. 또한 지수 표현을 위해 별도의 함수를 사용했었으나
**
라는 연산자로 추가되었다. - PHP 5가 2004년에 나온 후 거의 10년을 5에서 머물렀다. 사실 2005년부터 PHP 6를 개발하기 시작했지만 취소되는 바람에 10년간 우려먹게 된 것이다. PHP 6은 처음부터 유니코드를 기반으로 작동되도록 설계 되었고, 이 때문에 대단히 많은 변경 점이 예고된 버전이었다. 그러나 하필 인코딩으로 UTF-16을 선택한 것이 발목을 잡았다. 개발하는 사이 웹에서 유니코드 인코딩은 UTF-8이 대세가 되었기 때문이다. 이 실책으로 개발자들의 참여가 줄어들었고, 개발에 난항을 겪다가 2010년 5월에 PHP 6 프로젝트는 취소되었다. 그리고 PHP 6에서 논의되던 상당수의 기능은 PHP 5.4로 흡수되었다. UTF-8이 기본 인코딩이 된 것도 5.4 버전부터이다.
- 하지만 보안 문제가 드러나고 있는 PHP 5로 장기간 버티는 것은 아무래도 무리가 많았다. 엔진이 10년간 바뀌지 않은 채 유지되다 보니 다른 스크립트 언어가 발전하는 사이에 속도나 기능의 차이가 벌어지게 된 것이다. 작은 개선들은 있었지만, 근본적인 개선은 무리였다. 결국, 2014년 PHP 6는 건너뛰고 차기 버전으로 PHP 7을 개발하겠다고 발표한다. PHP 7은 PHP NG(Next Generation)라는 새로운 구현체였는데, 덕분에 2015년 6월 배포된 PHP 7 알파 1 버전은 PHP 5.6에 비해 약 70%, PHP 5.5보다 거의 2배의 성능 향상을 보여, HHVM 못지않은 성능을 보여줬다. 새로운 기능을 추가하면서도 기존 PHP 5와의 호환성을 최대한 유지한 상태로 넘어갔기 때문에 혼란은 많지 않았다.
- 2018년 12월 31일, 2018년 12월 6일에 업데이트가 된 PHP 5.6.39를 끝으로 PHP 5.6 지원이 완전히 종료되었다. 다만 마지막 업데이트는 2019년 1월 10일에 업데이트가 된 PHP 5.6.40이다. 이로써 PHP 5.x 버전은 15년간의 길고 긴 역사를 마감하게 되었다.
8.2. PHP 7
PHP 7의 발표 행보는 상당히 빠르다. 2015년 6월 11일에 알파 1이 나온 이후 한 달 만인 7월 10일에 베타 1이 나왔고, 8월 18일 릴리즈 후보안 1(RC1)이 나왔다. 12월 3일에 일반 이용자용(GA)이 나왔다. PHP 7은 PHP 5.6보다도 2배 빠른 성능이고, 함수 인자와 반환 값에 타입을 지정할 수 있게 되었다.- 2015년 12월 3일, 드디어 PHP 7 정식 버전이 발표되었다. #
// 삼항연산자로 처리 ? 앞에 값이 있으면 대입하고 없으면 뒤에 것을 쓴다.
$user = (!empty($_GET['user'])) ? $_GET['user'] : '';
// PHP7.0 부터는 같은 표현식이 간단해진다.
// ??(null 병합연산자) 앞에 변수가 없으면 뒤에것을 쓴다.
$user = $_GET['user'] ?? '';
}}}
- 2016년 6월 9일, PHP 7.1 알파 버전을 내놓았다. 이후 두 차례 더 알파 버전을 내놓은 뒤 7월 21일에 베타 버전으로 넘어갔다. 이후 릴리즈 후보안 1(RC1)은 9월 1일에 나왔다.
- 2016년 12월 1일, PHP 7.1 정식 버전이 발표되었다.
- 2017년 11월 30일, PHP 7.2 정식 버전이 발표되었다. 다른 언어처럼 count() 함수에 배열에 해당하지 않는 값이 매개변수에 들어갈 때 경고를 낸다.
드디어 정신 차렸구나 - 2018년 12월 3일, 2018년 9월 13일에 업데이트가 된 PHP 7.0.32를 끝으로 PHP 7.0 지원이 완전히 종료되었다. 다만 마지막 업데이트는 2018년 12월 6일에 업데이트가 된 PHP 7.0.33이다.
- 2018년 12월 6일, PHP 7.3 정식 버전을 발표하였다. Heredoc, Newdoc 문법이 유연해졌고, 함수 호출 시 마지막 파라미터 뒤에 콤마를 붙이는 것이 가능해졌다.
- 2019년 11월 26일, PHP 7.4 정식 버전이 발표되었다. 프리로딩이 도입되어 성능이 최대 8%의 향상 되었다. FFI 기능이 생겼는데 외부 함수 인터페이스이며 다른 언어로 컴파일된 dll, so파일의 기능을 php컴파일 없이 바로 사용 가능하다.
- 2019년 12월 1일, 2019년 10월 24일에 업데이트가 된 PHP 7.1.33를 끝으로 PHP 7.1의 지원이 완전히 종료되었다.
- AWS용 PHP7.4부터는 ARM 환경에서의 가속 기능을 추가했다.
- 2020년 11월 30일, 2020년 10월 1일에 업데이트가 된 PHP 7.2.34를 끝으로 PHP 7.2의 지원이 완전히 종료되었다.
- 2021년 12월 6일, 2021년 11월 18일에 업데이트가 된 PHP 7.3.33를 끝으로 PHP 7.3의 지원이 완전히 종료되었다.
- 2022년 11월 28일, 2022년 11월 3일에 업데이트가 된 PHP 7.4.33를 끝으로 PHP 7.4의 지원이 완전히 종료되었다. 이로써 이 버전으로 끝으로 7년간의 PHP 7.x의 역사가 종료되었다.
8.3. PHP 8
8.3.1. 8.0
- 2020년 PHP 8.0 부터 성능향상을 위한 JIT 도입, 정의되지 않은 변수 검사 등 예외처리 강화가 되었다.
- 에러를 일시적으로 감추는데 사용되던 @ 연산자의 역할이 축소되었다. fatal 에러는 @로 감출수가 없다.
[33] - 다른언어에서 옵셔널이라고도 부르는 null safe 연산자가 지원되어 프로그램의 안정성이 높아졌다.
{{{#!syntax php
$country = $session?->user?->getAddress()?->country;
}}}
- 다른언어에서 어노테이션이라고도 부르는 애트리뷰트기능이 지원된다.
주석은 사람이 해석하지만 애트리뷰트는 프로그램에게 해당 코드 역할을 지정하는 메타 데이터이다.
문법은#[]
{{{#!syntax php
{
#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /* ... */ }
}public function get($id) { /* ... */ }
}}}
- 함수의 매개변수에 이름을 붙일수 있게되었다.
{{{#!syntax php
//두번째 인자에 double_encode 이라는 이름이 있어 함수를 내부를 보지 않고도 false가 어떤역할인지 보는데 도움된다.
}}}
- 2020년 11월 26일 정식 출시 되었다.
- JIT 도입으로 서버프로그램들의 성능이 최대 2배까지 향상되었다.
- 특히 객체지향적으로 작성된 클래스, 객체관리와 cpu를 많이 쓰는 코드들의 성능이 올라갔다.
- PHP 8.0은 2023년 11월 26일에 지원이 완전히 종료될 예정이다.
- PHP 8.0 에서는 7.4까지의 느슨한 비교연산자에 대해 수정하였다. PHP 7.4 까지는 문자열과 숫자가 섞여있을 때 "123Foo" == "123" 이걸 참(true)으로 봤기때문에 ===을 사용하지 않으면 오류가 발생할 여지가 있었으나 8.0에서는 false 라고 평가함으로써 상식적이게 되었다.
- 예외와 오류처리 강화: PHP 대표적인 문제는 어떤 숫자를 0으로 나눌때 그냥 무시하고 작동했다는 것이다. 8.0부터는 Divide Zero 라는 예외 오류를 내고 예외처리를 할 수 있게 바뀌었다.
8.3.2. 8.1
- 드디어 경량 스레드 기능인 Fiber 가 RFC 찬반투표를 통과하여 도입되었다. 코틀린의 코루틴이나 자바스크립트의 async - await 과 같은 기능이다. 다만 유저가 바로 사용하는것보다 PHP의 동작을 좀 더 세밀하게 제어하는 API이기 때문에 비동기 라이브러리 제작에 맞춰져 있다고 한다. 이로써 PHP로도 비동기 프로그래밍이 쉬워지게 되었다.
- 그 밖에 타입 정리가 이루어졌는데 Enum 타입이 추가되었고, Resource 타입 삭제, PHP 내장 함수들 타입들이 모두 부여되었고, 내장 함수들 null 허용여부가 타입으로 엄격하게 적용되어 개발자가 실수할 여지가 줄어, 보안이 더욱 향상되었다.
- 출시는 2021년 11월 25일이다.
- PHP 8.1 부터는 지원기간이 1년 연장되어 총 4년의 보안패치를 받게된다.
- 지원 중단일은 2025년 11월 25일로 잡혀있다.
- 내장 익스텐션중 하나인 Mysqli의 기본동작이 에러리포팅 활성화로 변경되었다.
8.3.3. 8.2
2022년 11월 셋째 주 출시예정이었으나, 중간에 버그가 발견되어 12월 8일에 발표되었다. 추가 기능은 다음과 같다.- 에러났을때 민감변수[34]는 숨기고 나머지만 표시할 수 있게 민감변수 지정 애트리뷰트 추가.
- 객체 속성 동적생성을 경고로 분류
- 읽기전용 클래스
- 트레이트에서 상수 사용가능
- DNF 타입 지원 (유니온과 인터섹션 타입을 섞어쓸 수있는 타입이다.)
- PCRE 정규식에서 변경자(modifier) n 지원 추가
- 함수 호출구문 정리를 위한 일부문법 Deprecated
- 그 밖에 define 함수를 사용해서 객체를 상수로 선언하는 것이 가능해졌다. 이로써 불변 객체를 만들 수 있게 되었다.
8.3.4. 8.3
2023년 11월 23일 정식 배포 되었다.유효하지 않은 직렬화 문자열을 역직렬화 시도할 때, 기존의 E_NOTICE에서 E_WARNING로 에러 수준이 향상되는 등의 변경점이있다.
- PHP 의 호출스택의 최대 크기를 정할수있는 설정 ini 에 추가
- JSON 형식을 검증하는 json_validate() 함수 추가
- 내장된 XML, DOM 파싱 라이브러리 성능이 대폭개선되고 tag 선택 함수들도 추가되었다.
- 읽기전용 클래스를 익명클래스로 생성할 수 있게되었다.
- 클래스 상수의 타입을 지정할 수 있게되었다.
- 그 밖에 파일 작업시 I/O 가 줄어들어 약간의 성능향상이 있다.
8.3.5. 8.4
2024년 11월 배포 예정으로 개발중이다.- C# 스타일의 짧은 프로퍼티 get/set 이 도입되었다.
- 빌트인 익스텐션인 Dom 이 html5 스펙을 준수하게 되었다.
- array_find 함수가 추가되었다.
8.4. PHP 9
2025년~2026년 사이에 출시할 예정인 버전이다. 2018부터 조금씩 바꾼 PHP 엔진 개선점을 반영하는 버전이라고 한다.- 예외 처리 강화
- 객체 속성을 동적으로 생성할 수 있는 기본동작이 비활성화로 변경되었다. 동적 생성을 허용하려면 명시적으로 클래스에 에트리뷰트 추가 해야한다.
- 정의되지 않은 변수 사용 불가(fatal 에러)
- 정의되지 않은 배열키 사용 불가(fatal 에러)
- Vector 등 새 자료구조를 객체지향에 맞춰서 추가
9. 기타
- FastCGI로 프록시 하게 되면 HTTP헤더에 X-Powered-By 이름의 버전 정보가 추가된다. : X-Powered-By: PHP/7.4.2[36]
- 현재 웹상에 공개된 많은 웹 관련 애플리케이션들이 PHP로 작성되었기 때문에, 필요한 부분을 고칠 수 있을 정도로 배워두면 도움이 된다. 특히 간단한 서버용 자동화 스크립트 파일을 짜기에도 편리하고, 웹서버를 경험해보기 괜찮은 언어이다.
- 라이선스를 보면, 일단 프리프로세서는 3.x(PHP License/GPL 듀얼 라이선스)를 제외한 모든 버전이 PHP License라 불리는 독자적 라이선스를 따른다. MIT 허가서 비슷하지만 프리프로세서를 재배포할 때 (내용 수정 여부와 관계없이) 패키지명에 PHP라는 단어를 넣지 못하게 하고, 'This product includes PHP software, freely available from https://www.php.net/software'라는 문구를 코드에 삽입할 것을 강제하는 내용이 있어 GPL과는 호환이 되지 않는다.
- 페이스북에서 PHP에 지대한 공헌을 하고 있었다. 이유는 위에서 언급했듯이 페이스북이 PHP(or hack 언어) 기반으로 만들어졌기 때문.[37] 대표적으로 페이스북에서 PHP의 표준에 대해 공식화한 문서가 있다. 심지어 공식 PHP에서도 이 문서를 이용한다. 이전까지 PHP는 제대로 된 언어 사양서(php.net의 문서와는 성격이 조금 다르다)가 없었다. GitHub 페이지
- 피가로,워드프레스, 미디어위키, 일본라쿠텐 그 밖에 Magento와 WooCommerce라는 이커머스 플랫폼에도 PHP가 사용되고 있다. Magento와 WooCommerce는 세계 1, 2위를 다투는 오픈 소스 이커머스 플랫폼이다.
- 파생 프로젝트로 PEAR, PECL 등이 있다. 이름 때문인지 깨알같이 배와 오이피클이 각각 그려져 있다.
- Laravel, Codeigniter 등의 프레임워크가 있고 컴포저라는 의존성 관리 도구도 존재한다. 디버깅 도구로는 Xdebug가 쓰인다.
- 예전 버전에서는 가끔씩 이런 영어가 아닌 에러 메시지로 개발자들을 충격과 공포에 빠뜨리곤 했다.
{{{Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
- 2021년에 스택오버플로우에서 개발자 대상으로한 설문조사에서 기피 언어 9위에 오르기도 했다. 최신 웹 사이트들은 PHP를 잘 쓰지 않을 것으로 보이지만 단가 등의 문제로 고객들이 원하는 등 수요가 계속 있고, 개발자도 간단한 프로젝트라면 예전에 사용했던 PHP 코드들을 그냥 재활용해서 만드는 것이 편하기 때문에 의외로 많이 쓰이고 있다. 지금도 프레임워크나 CMS 등으로 신규 제작되고있고 대다수의 웹사이트가 PHP로 구동되는 등 매년 언어 점유율 순위에서 항상 상위권을 차지하고 있으며 리액트나 뷰로 된 프론트엔드와 PHP로 된 백엔드를 연동시켜서 굴리는 경우도 있다. 이렇게 기피 언어 순위와 점유율 순위 둘다 상위권을 놓치지 않는점이 아이러니하다.
10. PHP로 작성된 프로그램 목록
나무위키에 단독 문서가 있는 것만 추가한다. (가나다 순)- DYB최선어학원 홈페이지
- PocketMine-MP: 마인크래프트 BE 서버 프로그램
- XpressEngine
- 그누보드
- 네이비즘: 티켓이나 수강신청시 서버시간알려주는 사이트
- 라라벨
- 라이믹스
- NordVPN
- 리로스쿨
- 리즈너블(프레임워크)
- 모니위키
- 미디어위키
- 슬랙[39]
- 워드프레스
- 텍스트큐브 (태터툴즈)
- 푸키위키
- 픽시브
- 픽키
[1] 구, Zend Technologies Ltd.[2] 사실 PHP는 Perl과 좀 더 유사하다. 다만 C언어에서 파생된 문법을 사용하므로 C-like로 기술하였다.[3] 그런데 swoole, 로드러너와 같이 프로세스가 종료되지 않게 실행하는 프로그램을 쓰면 상태가 유지(stateful)되기 때문에 DB 커넥션 풀도 만들 수 있다. 이렇게 할 경우, 기존 PHP 코드를 수정해야 하는 단점이 있으며 앞서 말한 무상태성으로서 가졌던 장점도 사라지게 된다.[4] 스크립트의 언어 속성으로 language를 쓰는 것 또한 사실은 비표준이다. 표준대로라면 type으로 쓰는 것이 옳다. HTML4 시절부터 두 가지 형태가 혼용되고 있었는데, HTML5에서 후자가 살아남은 것.[5] 메모리나 cpu등에 앞서 저장된것을 말한다. 여기서는 php opcache 코드[6] 기존 함수는 지원하지만, 서서히 없애고 있다.[7] 대다수의 웹은 PHP 코드 처리보다 DB 가 더 느리기 때문에 DB 튜닝, 쿼리 개선이 성능향상에 더 영향이 크고 PHP 성능도 향상되어 유저가 체감할 정도는 아니다.[8] 이 옵션은 PHP 5.1부터 존재했지만 기본값이 꺼져 있어서 많은 개발자들이 그 존재를 몰랐고, 문제 해결의 어려움에 PHP를 떠나는 경우도 있었다.[9] Notice 수준의 로그로 보여주는데 php.ini에서 설정을 껐으면 모르고 지나치기 쉽다.[10] 전역변수를 덮어 쓰기하는 문제[11] 통계[12] Facebook이 새로운 프로그래밍 언어 Hack 공개, 2014-03-21, 클리앙[13] (Model)-출력(View)-입력 및 제어(Controller)에 해당하는 부분을 분리해서 작성하는 프로그래밍 방식.[14] PHP 5.3 이전에 개발된 프로그램[15] 루비 온 레일즈 등의 영향을 받은 다양한 MVC 패턴을 지원하는 웹 개발 프레임워크들이 개발되었기 때문에 어떻게 보면 오히려 난이도가 비슷하거나 낮아졌다고 할 수 있다. Laravel 웹 프레임워크 같은 경우에는 GitHub에서 Python의 대표적인 웹 개발 프레임워크인 Django의 star 수를 뛰어넘었다.[16] https://wordpress.org/about/stats/[17] 그누보드[18] PHP 프로그램 작성 권장 규칙[19] 예) 코드이그나이터 2 버전[20] PHP 특징인 무상태성이다. 종료되면서 해당프로그램의의 변수,객체, DB커넥션 등등이 모두 사라진다.[21] 사람들의 오해가 있는데 웹서버에서 구동하는 PHP는 1요청당 프로세스가 생성되고 종료되는 것이 아니다. php-fpm 에서 max_request 값으로 지정.[22] https://www.phpinternalsbook.com/php7/extensions_design/php_lifecycle.html[23] PHP 특성상 TS모드로 리눅스에서 수행하는것이 더 좋다는걸 알 수 있다.[24] PHP에는 제네릭이없는데 라스무스는 매년 열리는 PHP컨퍼런스인 phpCE 2018에서 제네릭 구현은 가능하지만 도입시 PHP가 실행 중 타입 체크를 하게되어 큰 성능저하가 있기 때문에 반대한다고 밝혔다.[25] 같은 약타입 인터프리터언어인 파이썬은 제네릭이 있는데 파이썬은 실행중에는 타입체크를 전혀 안하기 때문에 제네릭은 코드작성할때만 있는것이라 성능저하가 없다. 여담으로 자바는 컴파일 되면서 제네릭이 삭제되기에 성능에 지장이없다.[26] 아파치 HTTP 서버, NGINX 등[27] 이미 설치된 PHP 확인법은 phpinfo 함수로 확인하거나 윈도우cmd나 리눅스터미널에서 php -v를 입력하면 정보가 뜬다.[28] 훗날 PHP 7.0에서 재설계 되어 순환 참조 문제가 해결되었다.[29] 배열을
[]
로 선언하기, 배열을 리턴하는 함수를 곧바로 접근하기 등. 이것은 이미 오래전부터 JavaScript에서 구현된 것들이다. 이 외에도 JavaScript에서 유래한 일부 기능이 추가되었다.[30] 새 기능 소개[31] call by reference[32] null coalescing operator[33] 즉 PHP 7에서 버그를 잡지않고 작성한 코드들은 PHP 8에서 실행하려면 버그를 잡아야한다.[34] DB 비밀번호, 계정정보 등등[35] PHP 메일링 리스트를 표시하는 사이트[36] 여담으로 header_remove로 지울 수 있는데 지우지 않아서 프로그램 정보가 노출되면 서버 보안에 취약할 거라는 지적이 있다. #StackOverflow[37] 외국에서는 기업이 오픈소스 프로젝트를 이용하여 자사의 서비스를 구축한 경우 그 프로젝트에 기여(contribute)를 하는 일이 흔하다.[38] https://en.wikipedia.org/wiki/Scope_resolution_operator[39] Taking PHP Seriously