#!if 넘어옴1 != null
''''''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다.
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 다른 의미}}}에 대한 내용은 [[PHP(동음이의어)]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[PHP(동음이의어)#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[PHP(동음이의어)#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.
#!if 리스트 != null
{{{#!if 문서명1 != null
* {{{#!if 설명1 != null
다른 의미: }}}[[PHP(동음이의어)]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[PHP(동음이의어)#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[PHP(동음이의어)#|]] 부분}}}}}}{{{#!if 문서명2 != null
* {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
* {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
* {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
* {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
* {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
* {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
* {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
* {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
* {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}
[[프로그래밍 언어|'''프로그래밍 언어 {{{#!wiki style="font-family: Times New Roman, serif; display: inline;"]] | ||
{{{#!wiki style="min-height: calc(1.5em + 5px); margin: 0 -10px -5px" {{{#!wiki style="display: inline-table; min-width: 40%; min-height: calc(1.5em + 5px)" {{{#!folding [ 목록 ] {{{#!wiki style="margin: -5px -1px" | <colbgcolor=royalblue><colcolor=#fff> ※ 나무위키에 등재된 프로그래밍 언어 목록 |
A | ActionScript · AdaT · AgdaTP · ALGOLT · ApexT · APL · awk · AssemblyT | |||||||
B | BASIC | |||||||
C | ||||||||
D | ||||||||
E | Elixir · | |||||||
F | ||||||||
G | GNU Octave · | |||||||
H | ||||||||
I | ||||||||
J | ||||||||
K | ||||||||
L | LeanTP · | |||||||
M | MATLAB · MaxV · MojoT · Moonlight | |||||||
N | ||||||||
O | OberonT · Objective-CT · | |||||||
P | PascalT · Perl · | |||||||
Q | Q#T | |||||||
R | ||||||||
S | SAS · | |||||||
T | ||||||||
U | Udon | |||||||
V | Visual Basic · Visual Basic .NET · Visual Basic for Applications · vvvvV | |||||||
W | Wave | |||||||
X | XSharp | |||||||
Y | ||||||||
Z | ZenScript · | |||||||
한글 | 누리 · 숨V · 씨앗 · 약속 · | |||||||
T: 정적 타입 프로그래밍 언어 · P: 증명 보조 언어 · S: LISP 방언 및 S-표현식 기반 언어 · V: 시각적 프로그래밍 언어 | }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 40%; min-height: calc(1.5em + 5px)" {{{#!folding [ 순위 ] {{{#!wiki style="margin: -5px -1px -10px" | {{{#!wiki style="min-height: calc(1.5em + 5px); margin: 0 -10px -5px" {{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)" {{{#!folding [ IEEE Spectrum 2024 ] {{{#!wiki style="margin: -5px -1px" | <tablewidth=100%><tablebgcolor=transparent><colbgcolor=#11a500><colcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 | <colbgcolor=#ff1100><colcolor=#fff> 직업 부문 상위 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++ | }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)" {{{#!folding [ Stack Overflow 2024 ] {{{#!wiki style="margin: -5px -1px" | <colbgcolor=#ffa500><colcolor=#fff> 2024년 Stackoverflow 설문조사 상위 25개 프로그래밍 언어 | |||
1 | JavaScript | <colbgcolor=#ffa500><colcolor=#fff> 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 | }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)" {{{#!folding [ TIOBE 2025 ] {{{#!wiki style="margin: -5px -1px" | <colbgcolor=#2777c2><colcolor=#fff> 2025년 4월 TIOBE 검색어 점유율 상위 20개 프로그래밍 언어 | |||||
1 | Python | <colbgcolor=#2777c2><colcolor=#fff> 11 | Fortran | |||||
2 | C++ | 12 | Scratch | |||||
3 | C | 13 | PHP | |||||
4 | Java | 14 | R | |||||
5 | C# | 15 | Ada | |||||
6 | JavaScript | 16 | MATLAB | |||||
7 | Go | 17 | Assembly language | |||||
8 | Visual Basic | 18 | Rust | |||||
9 | Delphi / Object Pascal | 19 | Perl | |||||
10 | SQL | 20 | COBOL | }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)" {{{#!folding [ PYPL 2025 ] {{{#!wiki style="margin: -5px -1px -10px" | <colbgcolor=green><colcolor=#fff> 2025년 5월 PYPL 검색어 점유율 상위 20개 프로그래밍 언어 | |||
1 | Python | <colbgcolor=green><colcolor=#fff> 11 | Swift | |||||
2 | Java | 12 | Go | |||||
3 | JavaScript | 13 | Kotlin | |||||
4 | C/C++ | 14 | MATLAB | |||||
5 | C# | 15 | Ada | |||||
6 | R | 16 | Ruby | |||||
7 | PHP | 17 | Dart | |||||
8 | Rust | 18 | Lua | |||||
9 | TypeScript | 19 | VBA | |||||
10 | Objective-C | 20 | PowerShell | }}}}}}}}}}}} | }}}}}}}}}}}} | |||
실행 방식 · 분류 · 언어 목록(분류:프로그래밍 언어 문법) · 언어별 예제 · 틀:프로그래밍 언어 문법 · 틀:난해한 프로그래밍 언어 |
#!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.33 (2025. 7. 3.) | 역대 버전 | |
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.1.30 | 2024. 9. 26. | ||
8.1.31 | 2024. 11. 21. | ||
8.1.32 | 2025. 3. 13. |
- 8.2.29 (2025. 7. 3.)
- ||<-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.2.25 2024. 10. 24. 8.2.26 2024. 11. 21. 8.2.27 2024. 12. 19. 8.2.28 2025. 3. 13.
- 8.3.26 (2025. 9. 25.)
- ||<-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. 8.3.13 2024. 10. 24. 8.3.14 2024. 11. 21. 8.3.15 2024. 12. 19. 8.3.16 2025. 1. 16. 8.3.17 2025. 2. 13. 8.3.18 2025. 3. 13. 8.3.19 2025. 3. 13. 8.3.20 2025. 4. 10. 8.3.21 2025. 5. 8. 8.3.22 2025. 6. 5. 8.3.23 2025. 7. 3. 8.3.24 2025. 7. 31. 8.3.25 2025. 8. 28.
- 8.4.13 (2025. 9. 25.)
- ||<-2><tablebgcolor=#ffffff,#2D2F34><tablebordercolor=#ffffff,#2D2F34><tablealign=center> 역대 버전 ||
8.4.0 Alpha 1 2024. 7. 2. 8.4.0 Alpha 2 2024. 7. 16. 8.4.0 Alpha 3 2024. 7. 30. 8.4.0 Alpha 4 2024. 8. 1. 8.4.0 Beta 1 2024. 8. 13. 8.4.0 Beta 2 2024. 8. 15. 8.4.0 Beta 3 2024. 8. 15. 8.4.0 Beta 4 2024. 8. 27. 8.4.0 Beta 5 2024. 9. 11. 8.4.0 RC1 2024. 9. 25. 8.4.0 RC2 2024. 10. 8. 8.4.0 RC3 2024. 10. 23. 8.4.0 RC4 2024. 11. 5. 8.4.0 2023. 11. 20. 8.4.1 2024. 11. 21. 8.4.2 2024. 12. 19. 8.4.3 2025. 1. 17. 8.4.4 2025. 2. 13. 8.4.5 2025. 3. 13. 8.4.6 2025. 4. 10. 8.4.7 2025. 5. 8. 8.4.8 2025. 6. 5. 8.4.9 2025. 7. 3. 8.4.10 2025. 7. 3. 8.4.11 2025. 7. 31. 8.4.12 2025. 8. 28.
- 8.5.0 RC1 (2025. 9. 25.)
- ||<-2><tablebgcolor=#ffffff,#2D2F34><tablebordercolor=#ffffff,#2D2F34><tablealign=center> 역대 버전 ||
8.5.0 Alpha 1 2025. 7. 3. 8.5.0 Alpha 2 2025. 7. 17. 8.5.0 Alpha 3 2025. 7. 31. 8.5.0 Alpha 4 2025. 7. 31. 8.5.0 Beta 1 2025. 8. 14. 8.5.0 Beta 2 2025. 8. 28. 8.5.0 Beta 3 2025. 9. 11.
링크 | |
코드 저장소 | |
1. 개요
PHP는 대표적인 서버사이드 언어이며 범용 프로그래밍 언어이다. 전 세계 수많은 웹 시스템의 기반이다. C-like 문법[2]으로 되어 있고, CGI보다 나으며, Perl처럼 배열이 연관 배열[3]이라 데이터 넣기가 간편하다. 내장된 웹 관련 함수들이 많아 웹 페이지 제작 시 생산성이 높다는 점에서 사용자가 많다. 1995년 라스무스 러돌프가 만들었고, 지금은 오픈소스 프로젝트로 개발하고있다. PHP 재단(비영리)[4]에서도 코어 개발자를 고용하여 함께 관리하고있다.
PHP라는 이름은 원래 Personal Home Page Tools였는데, 지금은 PHP: Hypertext Preprocessor라는 재귀 약자를 사용하고 있다.
워드프레스, 미디어위키 등의 많은 애플리케이션이 PHP로 작성되어 있다. 웹 서핑 하다 보면 쓰는 곳이 많다는 걸 발견할 수 있다. 한국형 게시판 CMS인 라이믹스, 그누보드, 중소, 개인 쇼핑몰과 디시인사이드, 더쿠와 같은 대형 인터넷 커뮤니티, 언론사 웹사이트 등 대다수 웹사이트가 PHP로 제작되어 있다.
2. 특징
PHP는 Perl 언어의 영향을 많이 받았다. 변수 이름 앞에 $를 붙이는 것(예: $var), Perl 처럼 배열이 연관 배열로 작동하는 것, 문자열끼리 결합할 때 점(.) 연산자를 사용하는 것이 그 예이다.{{{#!syntax php
echo "Hello, " . "world!"; // 결과는 "Hello, world!"}}}
PHP에서는 +는 오직 숫자 덧셈만 하므로 일부 스크립트 언어에서 하던 대로 더하기 기호(+)로 문자열을 결합하려 하면 안 된다. 두 값이 숫자 0으로 형 변환 되어 잘못된 결과가 나온다(예: "Hello, " + "world!"; 결과는 0).
PHP의 큰 특징 중 하나는 무상태성(Stateless)으로, HTTP 프로토콜과 마찬가지로 상태를 유지하지 않는 성질이다. PHP 웹 서버에 요청하면, 해당 스크립트를 실행한 뒤 완전히 종료하고, 그다음 새 요청이 들어오면 처음부터 시작하는 방식이다. 이 때문에 PHP에서 싱글톤 패턴을 구현하면, 객체는 한 요청에 의한 작업이 끝날 때까지만 유지된다. 이러한 특성으로 인해 메모리 관리가 쉽고, 사용자(브라우저 요청, cli 입력 등)가 잘못된 입력을 해서 오류가 났을 때 개별적으로 처리하게 되므로 안전하지만, 상태를 유지할 수 없기에 기본 배포되는 PHP로는 DB 커넥션 풀을 만들 수가 없다.[5]
PHP는 다른 스크립트 언어와 달리 실행 중에 타입을 체크한다. 타입들이 점차 추가 되었으며 PHP 7 이후로 declare(strict_types=1)을 선언하면 암시적 형변환이 중단되고 타입체크가 강화된다.
PHP 파일은 <?php ... ?>로 이루어진 코드 실행 영역이 있다. 변수 하나만 출력한다면 <?=$var?> 형태로 줄여 쓸 수도 있다. 원래 short_open_tags 설정값이 off라면 이것도 같이 안되지만, PHP 5.4부터는 short_open_tags 설정값에 상관없이 항상 <?=$var?> 형태로 쓸 수 있게 되었다. 여담인데 <? ... ?>는 2000년대 중반부터 거의 안 쓴다. 이렇게 줄여 쓰는 방식은 비활성화되어 있는데 사용하려면 php.ini에서 short_open_tags 설정을 on으로 바꾸어야 한다. 비활성화된 이유는 XML의 문서 시작 표시인 <?xml version="1.0" encoding="UTF-8"?> 같은 구문과 충돌했기 때문이다. PHP가 처음 나왔을 때는 HTML만 있었기 때문에 줄여 쓰는 방식이 문제가 없었지만, HTML에 XML의 문법을 도입한 XHTML 1.0이 나오면서 충돌이 일어났고, 결국 저 옵션의 기본값이 off 로 변경된 것. 다행히 HTML5에서는 XML 문법이 빠졌다.
2004년 쯤에 WYSIWYG 기반 에디터를 사용할 때 <?php ... ?>로 이루어진 코드 실행 영역을 올바르지 않은 태그로 잘못 인식하는 문제를 회피하기 위해 <script language="php"> ... </script>[6] 태그를 사용하기도 했다. 그렇지만 이 태그는 JavaScript에서 쓰는 것과 혼동될 수 있어서 PHP 7부터 삭제되었다.
PHP 위원회는 새 버전의 기능을 RFC 문서로 제안받고, RFC에 올라온 사항들을 찬반 투표에 부쳐 찬성이 2/3을 넘길 경우 기능을 추가한다. 레딧, PHP 메일링 리스트 등에서 토론이 이루어진다. 새 기능 RFC 제안 사항 찬반 투표 진행과 결과를 공개하는 사이트.
PHP는 오픈 소스이며 포팅된 곳이 많아 거의 모든 웹 서버에서 실행할 수 있다. 유닉스(리눅스), 윈도우, macOS 모두 지원한다. PHP 공식 사이트에서는 소스 코드를 공개하고 있고, 리눅스 등의 유닉스 계열 OS에서 컴파일하는 방법을 알려주고 있다. 대부분의 경우 직접 컴파일할 필요는 없는데, 유명 리눅스 배포본의 공식 저장소에는 PHP 설치 패키지를 기본으로 제공하기 때문이다. 별도의 저장소를 추가하면 버전도 입맛대로 설치할 수 있다. PHP 5.5 버전부터 64비트 버전이 나왔다. 윈도우용은 PHP 공식 사이트에서 직접 실행 파일로 만들어서 제공한다. 윈도우용의 경우 동작 방식의 차이 때문에 IIS 및 NGINX에서 돌리는 PHP는 Non-Thread Safe 버전으로, 아파치에서 돌리는 PHP는 Thread-Safe 버전으로 따로 나온다. 맥 OS에는 이미 설치가 되어 나오는데, 더 최신 버전을 설치하고 싶으면 맥 OS의 패키지 관리자인 Homebrew(홈브루)를 통해서 설치할 수 있다.
2.1. 장점
- 사용자에게 보이는 HTML 페이지의 템플릿을 지원해서 쉽게 웹서버를 만들 수 있고, 웹 개발에 필요한 관련 함수들이 내장되어 있어서 개발 생산성이 뛰어나서 사용자가 급격하게 늘어났다.
- PHP는 무상태성(Stateless)이다. 장점은 요청할 때마다 새로 시작하기 때문에 배포가 편해지고, 오류에 대해 덜 민감하다. 예를 들면 다른 언어로 작성한 서버는 어떤 사용자가 잘못된 요청을 보내서 프로그램이 실패하면 해당 서버가 멈추게 되어 재부팅이 필요할 상황이 올 수도 있는데, PHP는 새 요청이 왔을 때 프로그램을 처음부터 시작하므로 사용자가 올바른 요청을 보내면 정상 작동한다. 오류를 개별적으로 처리하는 것이다. 그리고 매번 종료하고 있어 메모리 누수를 방지한다. 가비지 컬렉터도 PHP 5.3부터 도입되었다.
- PHP는 간편하게 서버에 올릴 수 있다. PHP 인터프리터에서 PHP 파일을 실행할 때마다 파일 내용을 확인 후, 바뀐 부분이 없으면 캐시 파일[7]을 실행하고, 바뀐 부분만 해석한 뒤 다시 캐시로 저장하는 방식이라 업로드만 하면 되니까 간편하다.
- 위의 특징들로 인해 프로젝트가 커지면 빌드 시간이 늘어나는 다른 언어들과 달리 PHP는 개발이나 배포할 때 빌드가 따로 없다.
2.2. 단점
- 설계 일관성 부족
라스무스가 처음 PHP를 만들 때 템플릿 언어로 시작하여 PHP 2.0 이후에 점차 범용 프로그래밍 언어로 확장되었기 때문에 설계일관성이 다소 부족하다는 평가를 받고 있다. 예를 들어 내장함수나 인자 이름 규칙에 일관성이 부족한데 초기에는 C 언어 함수의 이름 규칙을 따랐고, 그 이후 다양한 함수들이 추가되면서, 이름 규칙과 분류에 혼란이 발생했다. 이것 때문에 많이 까였다. 7.0 이후에는 계속 버전 업 하면서 바뀐 이름 규칙에 맞게 수정한 함수를 지원하는 등[8] 점차 나아지는 추세다.
- 무상태성의 단점 측면
PHP의 무상태성은 장점이자 동시에 단점으로 작용할 수 있다. PHP는 사용자 요청 후 종료되는 방식을 기본으로 한다. 그래서 프레임워크처럼 한번 띄워두고 사용해야 하는 것들도 매번 로딩되어 성능에 영향을 끼친다.[9] PHP 프로세스는 수천 회 재활용되지만 개별 요청에서 사용자의 프로그램이 초기화되는것은 동일하다.
극복노력: 위의 단점을 극복하고자 PHP 프로그램이 종료되지 않게 만드는 워커 모드의 프로그램들이 나왔다. swoole, 로드러너, 프랑켄 PHP 등인데 워커모드를 사용하면 성능을 크게 향상할 수있지만 코드 수정이나 관련 라이브러리를 설치해야 하고 배포 방식 변경이 필요하다.
- 과거 PHP는 오류를 숨기고 실행하는 동작이 기본값인 경우가 많았다.
오류 숨김 설정: PHP 8.1 이전에는 MySQL 연결 오류가 기본적으로 숨겨져 있어서, 문제 발생시 디버깅 과정이 어려웠다. 개발자들은 mysqli_report 함수에 MYSQLI_STRICT 옵션을 수동으로 설정해야만 정확한 오류를 확인할 수있었다.[10] PHP 8.1부터는 기본 동작이 오류가 즉시 발생하게 변경되어 디버깅이 더 쉬워졌다.
오류컨트롤 연산자: PHP 에는 오류를 숨기고 코드를 실행하게 지시하는 골뱅이(@) 연산자가 있다. 예전에 PHP가 템플릿 엔진으로 쓰일 때 오류를 로그 파일이나 터미널보다는 브라우저 화면에 표시하는 것이 일반적이었다. 그래서 오류 발생 시 화면이 멈추는 문제를 임시적으로 해결하기 위해 사용했다. PHP 8부터는 @의 역할이 축소되어 fatal 수준의 오류가 날때는 숨길 수 없다.
효율적인 디버깅 환경 설정법: 위의 단점들을 겪지 않으려면 다음과 같이 해야한다. PHP로 개발할 때는 숨겨진 기본값들을 수동으로 수정하고 mysqli 는 mysqli_report, PDO면 error_mode 등 설정이 필요하다. 그 외 다양한 디버깅 옵션을 활성화한 후 디스플레이 에러를 끄고 로깅과 xdebug와 같은 디버깅 툴을 사용하는것이 권장된다. 다른 언어에서 제공하는 개발 환경과 비슷한 수준을 만들 수 있다. PHP 프레임워크들은 이런 설정값들이 기본적으로 적용되어 있어 스택 트레이스 등 상세한 오류정보를 알려주고 개발 편의성이 좋다.
2.3. PHP 7.4 이하 버전 단점
- 정의되지 않은 변수(undefined)를 쓸 수 있었다. 이 단점은 최근 버전에서 수정했는데, PHP 8.0부터 알림에서 경고로 상향했다. PHP 9.0 부터는 정의되지 않은 변수를 쓰면 파싱 에러가 나고 쓸 수 없게 한다. (즉, 프로그램 실행 불가). 정의되지 않은 변수를 쓰는 것이 단점인 이유는 없는 변수를 써도 무시하기 때문에 의도치 않은 값이 들어가 보안 문제를 일으키거나 실수하기 때문이다.
- 옛날 버전들은(PHP 7.4 이하) 정의되지 않은 변수를 사용했다는 알림(Notice)만 보여줬다. 알림은 에러 설정을 E_ALL로 해놔야 표시된다.[11] 타입을 비교하지 않는 == 가 아닌 === 을 쓰더라도 같다는 결과가 나온다. 이를 확인하려면 get_defined_vars 함수(지역 변수) 또는 $GLOBALS 변수(전역 변수) 등을 통해 선언된 변수의 목록 배열을 얻어온 다음, 그 배열에 변수가 포함되어 있는지를 확인해야 한다. 그러나 null과 구분되지 않는 특성을 이용해 PHP 코드를 작성할 때는 isset 함수로 체크하는것이 일반적이다.
- 오류와 예외 처리가 일관되지 않다. PHP 8 이후 버전에서 변경되었다.
- PHP 5.X 대는 현재 PHP의 나쁜 이미지를 쌓는 시기였다. 새로운 버전이 출시되는 주기가 없었고 3년 걸릴 때도 있었다. 실행 속도는 느리고 이상한 동작도 많고 클래스 변수와 함수 리턴 타입을 지정할 수 없었다. 특히 PHP 5.4 까지는 보안에 문제가 많았는데 현재는 사라진 것 중에 대표적인 예로는 register global 이라고 외부요청으로 들어온 값들을 이름그대로 전역 변수로 만드는 동작이 있었다. PHP 5.X대가 오랫동안 유지되어 아마존, 페이스북을 비롯한 PHP를 사용하던 기업이 PHP 5.2 ~ 5.5 시기에 빠져나갔다.
2.4. 다른 웹 서비스 개발 기술과의 비교
종종 Java 진영의 JSP와 비교되기도 했었다.한국의 SI 업계에서는 JSP 개발자로 넘어가는 일이 많았는데, 공공 기관 프로젝트를 따내려면 정부에서 만든 전자정부프레임워크를 써야 가산점을 받아서 유리해지기 때문이다. 민간의 대규모 서비스는 PHP 5버전 시절 OOP 지원이 미흡했을 때 유지 보수성 등을 이유로 Java 기반을 요구하는 경우가 많았다.
일본이나 유럽 특히 프랑스에서는 PHP를 많이 쓰고 있다.[12]
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 나 C# 의 ASP.NET으로 옮겨갔다. PHP에서 제대로 된 객체 지향이 지원한 것은 2009년 발표된 PHP 5.3부터이다. 페이스북은 이전에는 PHP를 주 언어로 사용하다가 2014년 자사에서 PHP 기반으로 개발한 hack이라는 언어를 사용한다.[13]
과거 PHP에서는 MVC 패턴[14] 적용이 어려웠지만, PHP 5.3에 네임스페이스가 도입 되면서 패키지를 구성할 수 있게 되었고 객체 지향과 MVC 패턴으로 설계된 프레임워크가 많이 개발되었다. 그러나 오래된 CMS들은[15] 보안과 유지보수에 취약하게 작성되어 있었고, 그 밖에도 소규모 프로젝트에서는 관리가 힘든 경우가 많았다. 예를 들어 제로보드는 SQL 쿼리에 들어갈 변수들에 '준비된 실행문'(Prepared Statement)이라는 안전한 방식을 사용하지 않았는데, 그 결과 SQL 인젝션 공격을 받아 뽐뿌 개인정보 해킹 사건 등이 발생했다. 반면 2013년 출시된 XE의 경우 시작부터 MVC 아키텍처 구조였으며 SQL 인젝션 문제를 설계 변경으로 근본적으로 해결하였다. 드루팔의 경우는 2015년 드루팔 8부터 컴포저를 지원하고 개발이 쉬운 패키지 모듈로 개선되었다.
3.1. 모던 PHP
PHP 는 오랜 역사동안 변화와 발전을 거듭했다. 특히 PHP 5.3 버전이후부터 네임스페이스와 객체 지향 프로그래밍(OOP) 패러다임이 본격적으로 도입되고, 다양한 기술적 개선, 표준화가 이루어지면서 오늘날 우리가 '모던 PHP' 라고 부르는 형태가 되었다.- PHP 버전과 코드 설계의 변화
과거 PHP 코드는 스크립트 위주의 절차지향적으로 작성된 코드들이 많았고 2000년에 출시된 PHP 4 는 클래스 문법이 제한적이였다. PHP 5.3 이후로는 점점 객체 지향 프로그래밍이 사용되기 시작했으며 PHP 7.0 버전부터는 더욱 견고한 OOP 언어로서의 특성을 갖추게 되었다. 이러한 변화를 바탕으로 PHP 커뮤니티에서는 5.2 버전까지를 고전 PHP, 5.3 ~ 5.6 5년간을 과도기, 7.0 이후 버전은 현대 PHP로 분리해서 보는 시각이 있다. 현재는 2023년기준 워드프레스 통계에서도 PHP 5.6 이하는 점유율이 5% 이하로 떨어지는 등[16] 단순히 버전 만으로 모던과 아닌 것을 구분하는건 무의미하고, 코드설계로 평가해야한다.
- 프레임워크와 개발 표준의 확립
심포니 , 라라벨, Yii 등 PHP 프레임워크의 등장은 개발방식에 큰 변화를 가져왔다. 모델-뷰-컨트롤러(MVC) 아키텍처 와 같은 체계적인 설계가 적용되어 협업 관련 문제는 대부분 해소되었다.[17]. PHP의 좋지 않은 인식에 영향 끼친 상다수는 과거 5.2 시절에 절차지향적으로 작성된 일부 CMS들과 [18] 제대로 된 디자인 패턴이나 프레임워크가 확립되지 않아,[19] 보안 따위는 가볍게 날려버린 코드를 짜는 방법들이 있어서 그걸 쓰는 사람이 많았고, 'PHP는 안전하지 않다'라는 이미지를 심는 데 일조하였다.
이러한 문제를 해결하고 PHP 생태계 발전을 도모하기위해 PHP Framework Interop Group 이 출범하여 PSR 규칙[20] 을 제안하였다. 이로 인해 프레임워크가 정형화되고 상호운용성이 높아지게되었다. PHP 로 웹개발을 할 때는 PSR 규칙을 지키는 것이 권장된다.
이러한 문제를 해결하고 PHP 생태계 발전을 도모하기위해 PHP Framework Interop Group 이 출범하여 PSR 규칙[20] 을 제안하였다. 이로 인해 프레임워크가 정형화되고 상호운용성이 높아지게되었다. PHP 로 웹개발을 할 때는 PSR 규칙을 지키는 것이 권장된다.
- 오토로딩과 의존성 관리자의 도입
다른 언어 플랫폼처럼 모듈 등 생태계를 지원하기 위해 Composer라는 의존성 관리 도구가 나와 패키지 구성 과정을 간소화할 수 있게 되었다. PHP 라이브러리는 패키지스트에서 찾을 수 있다. https://packagist.org
컴포저에는 또다른 기능이 있는데 바로 PSR-4 에 정의된 오토로딩이다. 오토로딩은 php 파일경로를 include, require 등으로 일일히 코드에 적지 않아도 네임스페이스 기반으로 자동으로 호출할 수있게 해준다.
컴포저에는 또다른 기능이 있는데 바로 PSR-4 에 정의된 오토로딩이다. 오토로딩은 php 파일경로를 include, require 등으로 일일히 코드에 적지 않아도 네임스페이스 기반으로 자동으로 호출할 수있게 해준다.
- 보안과 지속적인 개선
PHP는 느슨한 타입 검사와 extract()로 변수 생성하기 등 보안 취약점이 지적되었다. 타입 강화는 PHP 7부터 개선된 부분이다. 초창기부터 이어져 온 특유의 함수 이름 비일관성은 여전히 고쳐나가는 중이다. PHP 8.1부터는 보안 문제로 지적받던 $GLOBALS 배열에 쓰기 작업하는 것이 금지되었다.
웹에 올라와 있는 PHP 비판 문서는 유심히 봐야 한다. 잘못된 내용을 적을 때도 있고, 현시점에서 해결된 문제도 떡하니 올려놓는 경우도 많다. 2015년 7.0이 나오기 이전 당시 버전인 5.x 시절에 작성된 글이 많다. 특히 PHP: 잘못된 디자인의 프랙탈 번역본이 퍼져 있는데, 이 글은 2012년에 작성되었고 PHP 5.4 버전 시점의 이야기이다. PHP 7.0에서 해당 글에 나온 많은 결함이 수정되었다. 2017년에 슬랙에서 작성한 PHP의 장단점 PHP에 대해 진지하게를 참고하는 편이 낫다. 물론 이것마저도 PHP 8.0에서 몇 가지 개선되었다. 결론을 말하자면, 개발자가 보안에 대해 인지하고 방어하는 코드를 쓰자는 것.
웹에 올라와 있는 PHP 비판 문서는 유심히 봐야 한다. 잘못된 내용을 적을 때도 있고, 현시점에서 해결된 문제도 떡하니 올려놓는 경우도 많다. 2015년 7.0이 나오기 이전 당시 버전인 5.x 시절에 작성된 글이 많다. 특히 PHP: 잘못된 디자인의 프랙탈 번역본이 퍼져 있는데, 이 글은 2012년에 작성되었고 PHP 5.4 버전 시점의 이야기이다. PHP 7.0에서 해당 글에 나온 많은 결함이 수정되었다. 2017년에 슬랙에서 작성한 PHP의 장단점 PHP에 대해 진지하게를 참고하는 편이 낫다. 물론 이것마저도 PHP 8.0에서 몇 가지 개선되었다. 결론을 말하자면, 개발자가 보안에 대해 인지하고 방어하는 코드를 쓰자는 것.
4. 작동방식(생명주기)
- PHP는 아래와 같은 과정으로 실행 된다.
- 사용자가 웹을 통해 요청하면(터미널에서 입력 시 4번으로)
- 웹 서버는 PHP의 SAPI 인터페이스를 통해 PHP로 요청을 전달한다.
- PHP 프로세스 풀에서 기존 프로세스를 찾거나 생성을 한다.
- PHP 엔진에서 해당 파일의 opcode(실행 코드) 캐시가 있는지 확인한다.
- PHP 8.0부터 JIT 기능을 켰을때는 opcode를 JIT에서 바이너리로 컴파일한다. 이때는 PHP VM을 건너뛰고 실행한다.
- opcode 캐시가 없으면 PHP 파일을 opcode로 컴파일한다. 있으면 opcode를 실행하는데 PHP VM을 통해 실행한다.
- 사용자의 요청에 따른 프로그램 실행
- 사용자 프로그램이 종료된다. 종료되면서 모든 객체와 변수등이 메모리에서 삭제된다. [21]
- 이하 반복
- PHP VM은 리눅스에서 1프로세스당 1엔진이며, PHP 설정에 따라 1 ~ N번의 사용자 요청을 수행한 다음에 웹 서버 프로그램의 프로세스 관리에 따라 프로세스가 종료 후 다시 생성된다.[22]
- 윈도우 서버의 IIS NTS 모드와 리눅스에서 TS 방식은(위에 기술한 것) 조금 다른데 자세한 내용은 PHP intenals Books에 나와있다.[23][24]
- PHP 문법에는 각종 타입들이 있는데, 실행중에 체크한다(런타임 체크).[25][26]
- 메타에서는 페이스북을 개발하다가 당시 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 은 웹 서버 프로그램[27]과 통신하는 모듈 형태이다. PHP로 HTTP/2를 지원하기 위해서는 PHP-FPM 을 사용해야 한다.
5. 개발 환경
배포 전에 오류를 잡고 개발 생산성을 높이기 위해서는 IDE를 쓰는 것이 좋다. IDE는 터미널, 디버거, 확장(Extension), 코드 편집기 등 개발에 도움울 주는 각종 기능들이 담겨 있다. 작업 중인 코드상의 문제를 추적해 주거나 스타일 수정을 해 주는 패키지와의 연동을 통해 GUI상에서 코드 퀄리티 관리를 자동으로 해 주는 편리한 기능도 제공한다.
VS Code 같은 에디터에서 디버깅 도구인 Xdebug를 설치하고 사용하는 방법도 있다. 특히 VS Code는 MS가 전폭적으로 밀어주고 있어 각종 플러그인 갯수가 늘어나는 중이다.
AI 가 통합된 커서 에디터나 아마존의 kiro 등은 vscode 를 수정하여 만들어졌는데
vscode 와 같은 플러그인을 설치해서 쓸수있다.
IDE 중에는 JetBrains사에서 개발한 유료 IDE PhpStorm이 편리한 코드 에디터, 각종 프레임워크 지원, DB 관리 통합, 신속한 지원에 힘입어 점유율을 늘려가고 있다. PhpStorm은 PHP뿐만 아니라 JavaScript, TypeScript, CSS지원 등 웹스톰의 기능들까지 전부 포함하고 있다.
린터로는 PHP CS Fixer가 인기 있고 정적분석기는 PHPStan 이 주로 쓰인다.
5.1. 웹 프레임워크
프레임워크란 개발의 방향성을 잡을 수있게 도와 주는 틀이 되는 소프트웨어다. 웹에서는 주로 MVC 아키텍처가 주류이다.- 라라벨: 첫 등장 이후 PHP 프레임워크 중에서 인기 많고 점유율이 높은 프레임워크이다. 루비 온 레일즈 설계에 영향을 받은 프레임워크이며 개발이 활발히 이루어지고 있다. 심포니 프레임워크의 모듈도 포함되어 있다.
- CakePHP: 일본의 루비 온 레일즈에 영향을 받아서인지 일본에서 가끔 쓰인다. 2018년쯤 들어서 쓰지 않는 추세다. 거의 다 라라벨로 갈아타는 추세.
- CodeIgniter(코드이그나이터): MVC 패턴이 있으나 3버전까지는 REST API 지원이 되지 않고, PHP 5.2를 지원하기 위한 하위 호환성 때문에 클래스 설계, 로딩 방식에 제약이 심하다. 4버전 이후로는 네임스페이스를 지원하게끔 다시 작성되었고 PSR 규칙이 몇 가지 적용되어 약간이나마 나아진 모양. 그러나 제작자 측에서 PSR 규칙을 모두 따르지 않겠다고 해서 라이브러리 사용에 제약이 있긴 하다.
- Symfony: 2005년 프랑스 개발자가 만든 심포니는 자바 진영의 스프링프레임워크의 설계에 영향받아 모듈화가 잘되어 있는 프레임워크이다. 공식 validation 스펙마저 자바의 JSR 명세를 따를 정도이다. 유럽, 특히 프랑스에서는 점유율이 아주 높다.
- Slim Framework : REST API에 특화된 프레임워크로 주로 API 라우팅용으로 쓰인다.
- Reasonable
- phalcon: C 익스텐션으로 개발된 풀 스택 PHP 프레임워크. PHP에서 변형된 독자 언어를 써야 한다.
가급적 쓰지 말자. - zend
- FuelPHP
- Yii
- PHPixe
5.2. 각종 ORM
ORM(Object-Relation Mapper)이란 SQL 쿼리를 사용하지 않고 객체 지향적으로 데이터베이스와 상호 작용 할 수 있게 도와주는 도구이다. 물론 만능은 아니라서 복잡한 DB 작업은 SQL을 써야 할 경우도 있고 기본적으로 데이터베이스를 잘 알아야 한다.ORM 구현 라이브러리
- Eloquent(엘로퀀트) ORM: 라라벨의 기본 ORM 이며 라라벨 없이 분리해서 사용하는것도 가능하다. 루비 온 레일즈의 ORM처럼 엑티브 레코드 패턴이다.
- 독트린 ORM: 자바의 JPA처럼 데이터 매퍼 패턴으로 설계되었다. 심포니 프레임워크에서 기본 ORM 으로 사용한다.
- 그 밖에 RedBean ORM 등이 있다.
5.3. 디버깅
- xdebug를 설치해서 사용하는 것이 일반적이다. PHP 5.4 버전부터 디버깅 도구인 phpdbg가 내장되었지만 이건 기능 부실해서 거의 안쓴다.
- xdebug는 PHP 지원 버전과 TS/NTS 여부에 따라 설치해서 쓴다.[28] Xdebug를 설치하면 다른 프로그래밍 언어와 마찬가지로 원격 디버깅이나 브레이크 포인트를 찍고 실행 흐름에 따라 변수들을 살펴보면서 디버깅이 가능하다. 다만 실서버에 설치하면 느려지므로 개발 서버나 개발하는 컴퓨터에서만 사용해야 한다.
5.4. 패키지 관리자
PHP 의 패키지 관리자는 컴포저(Composer) 가 있다. PHP 프로젝트에 필요한 라이브러리들을 관리한다.다운받은 프로그램은 composer.json 파일에 기록되는데 이를 의존성 관리라고 한다.
PHP 로 작성된 프로그램의 배포는 패키지스트 사이트를 이용한다.
5.5. 익스텐션
PHP 에는 PHP 엔진의 기능을 확장하여 C나 C++ 등으로 만든 익스텐션들이 있다.
* PECL(The PHP Extension Community Library) 피클이라고 읽는다. PECL은 속도 향상을 위해 C 언어 , C++ 등으로 작성된 PHP 익스텐션들을 배포하는 곳이다. PECL에 패키지를 올리려면 몇 가지 절차가 있는데 해당 익스텐션의 사용법을 php.net 에 문서를 올려야한다. 가끔 PHP 내장 함수도 아닌데 공식 문서에 설명이 있는 것은 이 때문이다.
* PECL(The PHP Extension Community Library) 피클이라고 읽는다. PECL은 속도 향상을 위해 C 언어 , C++ 등으로 작성된 PHP 익스텐션들을 배포하는 곳이다. PECL에 패키지를 올리려면 몇 가지 절차가 있는데 해당 익스텐션의 사용법을 php.net 에 문서를 올려야한다. 가끔 PHP 내장 함수도 아닌데 공식 문서에 설명이 있는 것은 이 때문이다.
예전에 PECL에서 인기 있던 라이브러리가 PHP 새 버전에서 통합되는 경우도 있었다. PHP 5.2의 json , PHP 5.5의 opcache 등이 그 예이다.
5.6. 익스텐션 관리자
PECL, Phar 은 PHP 익스텐션 관리 프로그램이다.2025년에는 새로운 익스텐션 프로그램인 PIE 가 출시되었다. 위의 두 프로그램과 달리 컴포저가 관리하는 composer.json 에 필요한 익스텐션이 적혀있으면 그걸 기준으로 다운받고 관리한다.
6. 문법
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[PHP/문법#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[PHP/문법#|]] 부분을
참고하십시오.7. PHP 코딩 표준안
PHP 5.3 이후 PHP 진영에도 프레임워크들이 나오면서 코딩 표준과 프레임워크들 호환에 관한 규칙을 PHP 프레임워크 그룹에서 정했다.- PSR 한국어 번역 문서
PSR 0 ~ 17가 있는데 그중에서 PSR 12가 코딩 표준이다. PSR 4는 PHP 클래스를 자동으로 불러오는 '오토로드' 기능인데 패키지 관리자인 컴포저가 제일유명하고 PHP 쪽에서 사실상 표준이 되었다. - PHP The Right Way 한국어 번역 문서
그리고 PHP The Right Way라는 문서가 인정받고 있다.
8. 업데이트
PHP의 업데이트 정책은 7.0 부터는 최신 버전 및 하위 2개 버전까지만 업데이트를 유지한다. 예를 들어 8.3이 나오면 8.2과 8.1는 지원하고, 8.0은 지원을 종료한다. PHP 재단을 설립한 뒤로 보안 업데이트가 1년 연장되어 PHP 8.1 부터는 총 4년의 지원을 받는다. 많이 쓰이는 몇몇 리눅스의 배포판(대표적으로 레드햇 리눅스와 우분투)은 PHP의 업데이트가 종료된 이후에도 독자적으로 계속 보안 업데이트를 지원한다. 이런 유명 배포판들은 보통 서버용으로 써서 지원 기간이 길고(특히 LTS로 부르는 장기 지원 버전), 호환성을 위해 해당 메이저 버전 내의 공식 저장소 PHP 버전을 바꾸지 않기 때문에 보안 업데이트를 제공하는 것이다. 그렇더라도, 성능과 편의성이 향상된 최신 버전을 쓰는 것이 좋다.8.1. PHP 5
- 2005년 11월 5.1 PHP에서 다양한 DB를 연결할 수 있는 PDO(PHP Data Object)가 도입되었다. PDO를 사용함으로써 DB 쿼리에 prepared statement(준비된 쿼리 구문)를 사용하여 SQL 인젝션 등의 취약점을 방지할 수 있게 되었다.
- 2007년 11월 5.2 JSON을 처리할 수 있는 함수가 내장되었다. Mysqli도 PDO처럼 prepared statement 쿼리를 할수있게 되었다.
- 2009년 6월 5.3 객체 지향에서 클래스 파일 위치를 구분하기 위한 네임스페이스, 익명 함수 문법이 추가되고 메모리 회수를 위한 가비지 컬렉터에서 순환 참조 문제가 일부 해결되었다.[29]
- 2012년 3월 5.4 업데이트된 기능[30]이 다른 언어에선 이미 지원되는 것들이었다.[31] 그리고 상속 없이 합성을 통한 클래스들을 모듈화할 수 있는 트레이트 문법을 지원하게 되었다.
- 2013년 6월에 5.5가 배포되었다. yield 및 finally 키워드 지원, 보안성 강화, 배열 지원 강화 등을 골자로 하고 있다. 보안상의 문제 때문에 mysqli 및 PDO를 제외한 오래된 MySQL 함수는 지원 중단(deprecated) 요소였다가 PHP 7에서는 완전히 제거되었다.
- 2014년 8월에 5.6이 배포되었다. $HTTP_RAW_POST_DATA가 지원 중단 요소가 되었고 PHP 기본 스트림으로 대체하기로 했다. 2GB 이상의 파일 업로드가 가능해졌다. 또한 지수 식에 쓰는 거듭제곱 연산을 위해 사용하던 pow 함수를 사용했는데, 같은 역할을 하는
**
연산자가 추가되었다.
- 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보다도 두배 빠르고 CPU, 메모리 사용량이 대폭 감소하였다. 함수 인자와 반환값에 타입을 지정할 수 있게 되었다.- 2015년 12월 3일, 드디어 PHP 7 정식 버전이 발표되었다. #
- AST 파서가 적용되었고 메모리 사용량이 1/5로 감소했다.
- 실제로 여러 사용자와 벤치마크에 의하면 PHP 7은 이전보다 2배에서 10배까지도 빠르다고 한다.
- 객체를 다른 곳에 전달할 때 값 복사였는데 7.0부터는 참조 전달을 하도록 기본 동작이 바뀌어서 객체에는 &를 쓰지 않아도 된다.[32]
- 함수의 매개 변수에 타입을 지정할 수 있게 되었다.
- PHP 4 스타일의 생성자 문법이 삭제되고 5.0부터 바뀐 문법을 써야 한다.
- 물음표 두 개를 표기하는 null 병합 연산자가 지원되어 편리해졌다.[33]
{{{#!syntax php
// 삼항 연산자로 처리 ? 앞에 값이 있으면 대입하고 없으면 뒤엣것을 쓴다.
$user = (isset($_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 에러는 @로 감출수가 없다.
[34] - 다른 언어에서 옵셔널이라고도 부르는 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일에 발표되었다.- SensitiveParameter 애트리뷰트가 추가 되었다 에러 났을 때 민감 파라미터[35]는 숨기고 나머지만 표시하게 지정할 수있다.
- 객체 속성 동적 생성을 경고로 분류
- 읽기 전용 클래스
- 트레이트에서 상수 사용 가능
- 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 선택 함수들도 추가되었다.
- 읽기 전용 클래스를 익명 클래스로 생성할 수 있게 되었다.
- 클래스 상수의 타입을 지정할 수 있게 되었다.
- file 함수 7% 성능향상
- RecursiveDirectoryIterator 함수의 파일 I/O 성능이 향상되었다.
8.3.5. 8.4
2024년 11월 배포되었다.- C# 스타일의 짧은 프로퍼티 get/set이 도입되었다.
- 빌트인 익스텐션인 Dom이 HTML5 스펙을 준수하게 되었다.
- array_find, array_find_key, array_any, array_all 함수가 추가되었다.
- exit 구문이 지원중단 요소가 되었고 일반함수로 변경예정이다. exit; -> exit();
8.3.6. 8.5
2025년 11월 배포 예정으로 개발 중이다.- 리플렉션 함수들이 속도가 조금 개선되었다.
- 파이프 연산자가 추가되었다.
이 연산자는 opcache 컴파일과정에서 최적화되어 오버헤드는 없다고한다. - Fatal 레벨의 오류가 발생할때 나오는 스택트레이스가 개선되었다.
- opcache 가 컴파일 필수로 변경되어 VM 의 중복로직이 제거되었다.
C언어 인터프리터 속도를 개선하는 Tail Call 에 관한 글이 있는데 PHP에도 적용 중이라고 한다.
8.4. PHP 9
2026년~2027년 사이에 출시할 예정인 버전이다. 2018년부터 조금씩 바꾼 PHP 엔진 개선점을 반영하는 버전이라고 한다.- 예외 처리 강화
- 객체 속성을 동적으로 생성할 수 있는 기본 동작이 비활성화로 변경되었다. 동적 생성을 허용하려면 명시적으로 클래스에 에트리뷰트 추가 해야 한다.
- 정의되지 않은 변수 사용 불가(fatal 에러)
- 정의되지 않은 배열키 사용 불가(fatal 에러)
- declear strict_types 가 기본동작이 될것이다.
- Vector 등 새 자료 구조를 객체 지향에 맞춰서 추가
9. 기타
- FastCGI로 프록시하게 되면 HTTP 헤더에 X-Powered-By 이름의 버전 정보가 추가된다. : X-Powered-By: PHP/7.4.2[37]
- 현재 웹에 공개된 많은 웹 관련 애플리케이션들이 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 언어) 기반으로 만들어졌기 때문.[38] 대표적으로 페이스북에서 PHP의 표준에 대해 공식화한 문서가 있다. 심지어 공식 PHP에서도 이 문서를 이용한다. 이전까지 PHP는 제대로 된 언어 사양서(php.net의 문서와는 성격이 조금 다르다)가 없었다. GitHub 페이지
- 피가로,워드프레스, 미디어위키, 일본 라쿠텐 그 밖에 Magento와 WooCommerce라는 이커머스 플랫폼에도 PHP가 사용되고 있다. Magento와 WooCommerce는 세계 1, 2위를 다투는 오픈 소스 이커머스 플랫폼이다.
- 파생 프로젝트로 PEAR, PECL 등이 있다. 이름 때문인지 깨알같이 배와 오이피클이 각각 그려져 있다.
- Laravel, Codeigniter 등의 프레임워크가 있고 컴포저라는 의존성 관리 도구도 존재한다. 디버깅 도구로는 Xdebug가 쓰인다.
- PHP 5.3 이전 버전에서는 가끔씩 이런 영어가 아닌 에러 메시지로 개발자들을 충격과 공포에 빠뜨리곤 했다.
{{{Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
- 2021년에 스택 오버플로에서 개발자 대상으로 한 설문조사에서 기피 언어 9위에 오르기도 했다. 최신 웹사이트들은 PHP를 잘 쓰지 않을 것으로 보이지만 단가 등의 문제로 고객들이 원하는 등 수요가 계속 있고, 개발자도 간단한 프로젝트라면 예전에 사용했던 PHP 코드들을 재활용해서 만드는 것이 편하기 때문에 많이 쓰이고 있다. 지금도 프레임워크나 CMS 등으로 신규 제작되고있고 대다수의 웹사이트가 PHP로 만들어져있어 등 매년 언어 점유율 순위에서 항상 상위권을 차지하고 있으며 리액트나 뷰로 된 프론트엔드와 PHP로 된 백엔드를 연동시켜서 쓰는 경우도 있다. 이렇게 기피 언어 순위와 점유율 순위 둘다 상위권을 놓치지 않는점이 아이러니하다.
10. PHP로 작성된 웹사이트/프로그램 목록
나무위키에 단독 문서가 있는 것만 추가한다(가나다순).또한, CMS, Laravel로 작성된 웹사이트는 제외
- Anon Hosting 무료 다크웹 호스팅 사이트
- Bitview, BitVide 유튜브 초창기 홈페이지 모방 동영상 스트리밍 사이트
- DYB최선어학원 홈페이지
- KissJAV
- MediaFire 파일 공유 사이트
- NordVPN
- OpenCart
- phpMyAdmin
- phpBB 해외에서 널리 쓰이는 포럼 CMS
- PocketMine-MP: 마인크래프트 BE 서버 프로그램
- Rhymix
- XpressEngine, XE3
- 4chan 미국의 이미지보드 사이트 [40]
- 그누보드
- 가생이닷컴
- 네이비즘 티켓이나 수강 신청 시 서버 시간 알려주는 사이트
- 디시인사이드
- 라라벨
- 리로스쿨
- 리즈너블(프레임워크)
- 마일모아
- 모니위키
- 미디어위키
- 배추빌더
- 뽐뿌
- 실크 로드(블랙마켓) 세계 최대 규모 다크웹 마약 마켓 플레이스
- 슬랙[41]
- 유튜브 초창기 버전 2005년 2월 ~ 2006년 10월 구글이 인수하기 전까지는 PHP를 사용했었다.
- 워드프레스
- 어둠의 노사모 재단
- 제로보드
- 텍스트큐브 (태터툴즈)
- 포르노허브 #
- 푸키위키
- 픽시브
- 픽키
- YXL https://yxl.kr 숲 티비 염보성의 크루(YXL, YB) 공식 홈페이지
11. 둘러보기
TIOBE 선정 올해의 프로그래밍 언어 / PHP | |||||
{{{#!folding [펼치기 / 접기] | 2003년 C++ | → | 2004년 PHP | → | 2005년 Java |
[1] 구, Zend Technologies Ltd.[2] 사실 PHP는 Perl과 좀 더 유사하다. 다만 C 언어에서 파생된 문법을 사용하므로 C-like로 기술하였다.[3] 자료구조로는 해시맵.[4] https://thephp.foundation[5] 그런데 swoole, 로드러너와 같이 프로세스가 종료되지 않게 실행하는 프로그램을 쓰면 상태가 유지(stateful)되기 때문에 DB 커넥션 풀도 만들 수 있다. 이렇게 할 경우, 기존 PHP 코드를 수정해야 하는 단점이 있으며 앞서 말한 무상태성으로서 가졌던 장점도 사라지게 된다.[6] 스크립트의 언어 속성으로 language를 쓰는 것 또한 사실은 비표준이다. 표준대로라면 type으로 쓰는 것이 옳다. HTML4 시절부터 두 가지 형태가 혼용되고 있었는데, HTML5에서 후자가 살아남은 것.[7] 메모리나 CPU 등에 앞서 저장된 것을 말한다. 여기서는 php Opcache 코드.[8] 기존 함수는 지원하지만, 서서히 없애고 있다.[9] 대다수의 웹은 PHP 코드 처리보다 DB 가 더 느리기 때문에 DB 튜닝, 쿼리 개선이 성능 향상에 더 영향이 크고 PHP 성능도 향상되어 유저가 체감할 정도는 아니다.[10] 이 옵션은 PHP 5.1부터 존재했는데 기본값이 off 로 되어있어서 개발자들이 그 존재를 모르는경우도 있었고, 문제 해결의 어려움에 PHP를 떠나는 경우도 있었다.[11] Notice 수준의 로그로 보여주는데 php.ini에서 설정을 껐으면 모르고 지나치기 쉽다.[12] 통계[13] Facebook이 새로운 프로그래밍 언어 Hack 공개, 2014-03-21, 클리앙[14] (Model)-출력(View)-입력 및 제어(Controller)에 해당하는 부분을 분리해서 작성하는 프로그래밍 방식.[15] PHP 5.3 이전에 개발된 프로그램[16] https://wordpress.org/about/stats/[17] 루비 온 레일즈 등의 영향을 받은 다양한 MVC 패턴을 지원하는 웹 개발 프레임워크들이 개발되었기 때문에 어떻게 보면 오히려 난이도가 비슷하거나 낮아졌다고 할 수 있다. Laravel 웹 프레임워크 같은 경우에는 GitHub에서 Python의 대표적인 웹 개발 프레임워크인 Django의 star 수를 뛰어넘었다.[18] 그누보드[19] 예) 코드이그나이터 2 버전[20] PHP 프로그램 작성 권장 규칙[21] PHP 특징인 무상태성이다. 종료되면서 해당 프로그램의의 변수, 객체, DB 커넥션 등등이 모두 사라진다.[22] 사람들의 오해가 있는데 웹 서버에서 실행하는 PHP는 1요청당 프로세스가 생성되고 종료되는 것이 아니다. php-fpm 설정에서 max_request 값으로 지정.[23] https://www.phpinternalsbook.com/php7/extensions_design/php_lifecycle.html[24] PHP 특성상 TS 모드로 리눅스에서 수행하는 것이 더 좋다는 걸 알 수 있다.[25] PHP에는 제네릭이 없는데 라스무스는 매년 열리는 PHP 컨퍼런스인 phpCE 2018에서 제네릭 구현은 가능하지만 도입 시 PHP가 실행 중 타입 체크를 하게 되어 큰 성능 저하가 있기 때문에 반대한다고 밝혔다.[26] 같은 약타입 인터프리터 언어인 파이썬은 제네릭이 있는데 파이썬은 실행 중에는 타입 체크를 전혀 안 하기 때문에 제네릭은 코드 작성할 때만 있는 것이라 성능 저하가 없다. 여담으로 자바는 컴파일되면서 제네릭이 삭제되기에 성능에 지장이 없다.[27] 아파치 HTTP 서버, NGINX 등[28] 이미 설치된 PHP 확인법은 phpinfo 함수로 확인하거나 윈도우 cmd나 리눅스 터미널에서 php -v를 입력하면 정보가 뜬다.[29] 훗날 PHP 7.0에서 재설계되어 순환 참조 문제가 해결되었다.[30] 배열을
[]
로 선언하기, 배열을 리턴하는 함수를 곧바로 접근하기 등. 이것은 이미 오래전부터 JavaScript에서 구현된 것들이다. 이 외에도 JavaScript에서 유래한 일부 기능이 추가되었다.[31] 새 기능 소개[32] call by reference[33] null coalescing operator[34] 즉 PHP 7에서 버그를 잡지 않고 작성한 코드들은 PHP 8에서 실행하려면 버그를 잡아야 한다.[35] DB 비밀번호, 계정 정보 등등[36] PHP 메일링 리스트를 표시하는 사이트[37] 여담으로 header_remove로 지울 수 있는데 지우지 않아서 프로그램 정보가 노출되면 서버 보안에 취약할 거라는 지적이 있다. #StackOverflow[38] 외국에서는 기업이 오픈 소스 프로젝트를 이용하여 자사의 서비스를 구축한 경우 그 프로젝트에 기여(contribute)를 하는 일이 흔하다.[39] 올바른 표현은 paamayim nekudatayim, פעמיים נקודותיים[40] 여담으로 2025년에 공개된 웹사이트 소스코드에, SQL injection 취약점도 있었다고 한다.[41] Taking PHP Seriously