PHP
최근 수정 시각: (5년 전)
PHP - Hypertext Preprocessor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
최초 개발자 | Rasmus Lerdorf | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
운영 및 개발 | The PHP Group | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
공식 사이트 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
라이선스 | PHP License | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
처음 버전 |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
최신 버전 | 7.3.27 (2021.02.04.)
7.4.15 (2021.02.04.)
8.0.2 (2021.02.04.)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. 개요 [편집]
<?php
echo "Hello, World!";
?>대표적인 서버 사이드 스크립트 언어로 전 세계 수많은 웹 시스템의 기반이 되는 언어. 비슷한 언어로는 ASP, JSP 등이 있다. C-like 문법[1]을 사용하여, 소규모 웹 페이지 제작시 기본적으로 웹관련 함수들이 많아 생산성이 높다는 점에서 사용자, 사용처가 많다. 1995년 라스무스 러돌프가 처음 공개했고, 지금은 The PHP Group 이라는 단체에서 개발 및 관리를 맡고 있다.PHP라는 이름은 원래 Personal Home Page Tools였는데, 지금은 PHP - Hypertext Preprocessor의 재귀 약자를 사용하고 있다.
워드프레스, 미디어위키 등의 많은 애플리케이션이 PHP로 짜여 있다. 의외로 웹서핑을 해보면 쓰이는 곳이 많다. 우리나라 한정으로 높은 점유율을 차지한 XpressEngine과 라이믹스, 영카트는 PHP로 제작됐다.
우리나라 중소 쇼핑몰과 인터넷 커뮤니티, 지역언론사 등 대다수가 PHP 거나 PHP 기반 CMS로 제작되어 있다.
2. 특징 [편집]
PHP는 오픈 소스인데 포팅된 곳이 많아 거의 모든 웹 서버에서 실행할 수 있다. PHP 공식 사이트에서는 소스 코드를 공개하고 있고, 리눅스 등의 유닉스 계열 OS에서 컴파일하는 방법을 알려주고 있다. 그러나 대다수의 경우 직접 컴파일을 할 필요는 없는데, 유명 리눅스 배포본의 공식 저장소에는 PHP 설치 패키지를 기본으로 제공하기 때문이다. 만약 없다면 Packagist 같은 패키지 저장소(repository)에서 각 OS의 환경에 맞는 PHP 설치 패키지를 찾을 수 있다. 별도의 저장소를 추가하면 버전도 입맛대로 설치할 수 있다. 윈도우용은 PHP 공식 사이트에서 직접 실행 파일로 만들어서 제공한다. PHP5.5 버전부터는 64비트 버전도 나오고 있다. 윈도우용의 경우 동작 방식의 차이 때문에 IIS 및 NGINX에서 돌리는 PHP는 Non-Thread Safe 버전으로, 아파치에서 돌리는 PHP는 Thread-Safe 버전으로 따로 나온다.
PHP는 Perl언어의 영향을 받아 변수 이름 앞에 $를 붙인다는 점(예: $abc)과 문자열끼리 결합할 때 덧셈 기호(+)를 점(.)으로 대신해서 쓴다는 점(예: "Hello, " . "world!" = "Hello, world!")이다. 후자의 경우, 다른 프로그래밍 언어에서 하던대로 덧셈 기호(+)으로 문자열 결합을 해보려고 하면 덧셈 기호 앞뒤에 있는 두 문자열을 숫자로 변환해서 계산해 버린다. (예: "Hello, " + "world!" = 0)[2]
PHP 의 큰 특징 중 하나는 상태가 없다는 점(Stateless)인데, PHP웹 서버에 요청을 할 때 해당 스크립트를 프로세서가 실행한 뒤 바로 종료되고 새로 요청이 들어오면 새롭게 시작되는 방식이다. 때문에 PHP에서 싱글톤 패턴을 구현하면 객체는 1회 요청에 의한 작업이 끝날때까지만 유지된다.
다른 서버 사이드 스크립트 언어와 마찬가지로
아주 옛날에는 WYSIWYG 기반 에디터를 사용할 때
PHP는 Perl언어의 영향을 받아 변수 이름 앞에 $를 붙인다는 점(예: $abc)과 문자열끼리 결합할 때 덧셈 기호(+)를 점(.)으로 대신해서 쓴다는 점(예: "Hello, " . "world!" = "Hello, world!")이다. 후자의 경우, 다른 프로그래밍 언어에서 하던대로 덧셈 기호(+)으로 문자열 결합을 해보려고 하면 덧셈 기호 앞뒤에 있는 두 문자열을 숫자로 변환해서 계산해 버린다. (예: "Hello, " + "world!" = 0)[2]
PHP 의 큰 특징 중 하나는 상태가 없다는 점(Stateless)인데, PHP웹 서버에 요청을 할 때 해당 스크립트를 프로세서가 실행한 뒤 바로 종료되고 새로 요청이 들어오면 새롭게 시작되는 방식이다. 때문에 PHP에서 싱글톤 패턴을 구현하면 객체는 1회 요청에 의한 작업이 끝날때까지만 유지된다.
다른 서버 사이드 스크립트 언어와 마찬가지로
<?php ... ?>로 이루어진 스크립트 실행 영역이 있다. <? ... ?>는 비권장이다. 변수 하나만 출력할 때에는 <?=$var?> 같은 형식으로도 줄일 수 있다. 그러나 이렇게 줄여 쓰는 방식은 기본적으로 꺼져 있어서 쓰려면 php.ini에서 short_open_tags의 설정을 on으로 바꿔줘야 한다. 줄여 쓰는 방식이 꺼져 있는 이유는 XML의 <? xml version="1.0" ?>과 같은 구문과 충돌하기 때문이다. PHP가 처음 나왔을 때는 HTML만 있어서 줄여 쓰는 방식이 문제가 없었지만, HTML에 XML의 문법을 도입한 XHTML 1.0이 나오면서 충돌이 일어났고 결국 저 옵션이 기본적으로 꺼져 있는 것으로 변경된 것. 다행히 HTML5에서는 XML 문법이 빠졌다. PHP 5.4부터는 short_open_tags 설정값에 상관없이 항상 <?=$var?> 형태로 쓸 수 있게 되었다.아주 옛날에는 WYSIWYG 기반 에디터를 사용할 때
<?php ... ?>로 이루어진 스크립트 실행 영역을 올바르지 않은 태그로 잘못 인식하는 문제를 회피하기 위해 <script language="php"> ... </script>[3] 태그를 사용하기도 했다. 그러나 이 태그는 JavaScript에서 쓰는 게 일반적이고 그 때문에 혼동된다는 문제로 쓰임이 줄어들었고 레거시 요소로 남아있다가 PHP 7부터는 삭제되었다.2.1. 장점 [편집]
- PHP는 서버에 배포하는게 간편하다. PHP 인터프리터에서 실행할 때마다 파일을 읽고 바뀐 부분이 없으면 캐시[4]를 실행하고 바뀐 부분은 다시 해석한 뒤 캐시 하는 방식으로 작동해서 업로드만 하면 되므로 신경 쓸 것이 줄어든다.
- PHP는 등장 당시 C언어로 웹서버를 작성하는 CGI에 비해 배우기 쉬우며 사용자가 보는 HTML페이지의 템플릿도 지원되면서 웹서버를 만들 수 있고 웹 개발에 필요한 관련 함수들이 내장되어 있다는것이 장점이였다.
2.2. 단점 [편집]
- PHP는 7.4까지 정의되지 않은 변수(undefined)를 쓸수있었다.[6] 정의되지 않은 변수는 결과값으로 null로 형변환해서 보여준다. 다만 정의 되지 않은 변수를 사용했다는 알림을 보여주기는한다. 에러 보여주는 설정을 E_ALL 로 해놔야 표시된다 [7] , 느슨한 ==가 아닌 ===를 쓰더라도 같다는 결과가 나온다. 이를 확인하려면 get_defined_vars 함수(지역 변수) 또는 $GLOBALS 변수(전역 변수) 등을 통해 선언된 변수의 목록 배열을 얻어온 다음, 그 배열에 변수가 포함되어 있는지를 확인 하여야 한다. 그러나 null과 구분하지 않는 특성을 이용해 보통은 isset함수로 체크한다.
- 스크립트 언어라는 특성상 인터프리터 방식을 사용하는 만큼 성능 한계가 있다. 공식적으로 멀티스레딩을 지원하지 않으며 멀티프로세싱 방식으로 동작한다. 한편 PHP 8.0 버전부터는 인터프리터에 JIT이 지원되어 기존 7.4대비 2배 가량의 성능향상이 있다.
2.3. 다른 웹 서비스 개발 기술과의 비교 [편집]
종종 Java 진영의 JSP와 비교되기도 했었다.
한국의 SI업계에서는 PHP 개발자에서 JSP 개발자로 넘어가는 일이 상당히 많았는데, 공공기관에서는 정부에서 만든 자바기반의 전자정부프레임워크를 써야 사업을 발주할 수 있는 경우가 대다수고 민간 대규모 사업에서 유지보수성이나 안정성, 성능 등을 이유로 Java 기반을 요구하는 경우가 많기 때문이다.
일본과 중국에서는 PHP가 많이 쓰이고있다.
2020년 현재에는 다음과 같은 기술들이 전세계 웹 서비스 개발에 주로 사용되고 있다.
한국의 SI업계에서는 PHP 개발자에서 JSP 개발자로 넘어가는 일이 상당히 많았는데, 공공기관에서는 정부에서 만든 자바기반의 전자정부프레임워크를 써야 사업을 발주할 수 있는 경우가 대다수고 민간 대규모 사업에서 유지보수성이나 안정성, 성능 등을 이유로 Java 기반을 요구하는 경우가 많기 때문이다.
일본과 중국에서는 PHP가 많이 쓰이고있다.
2020년 현재에는 다음과 같은 기술들이 전세계 웹 서비스 개발에 주로 사용되고 있다.
- Java 진영의 Spring(프레임워크)
- Ruby 진영의 Ruby on Rails
- C#의 .NET Core 주로 북미에서 쓰인다
3. 레거시와 현대화 [편집]
2000년대 초반(2005년 이전) 국내에서는 네이버도 PHP를 사용하긴 하였는데, 그 당시 PHP는 구동속도도 느린데다 객체지향을 지원하지 않았기 때문에 협업이 힘들다는 이유로 2000년대 중반 Java 계열의 JSP나 C# 계열의 ASP.NET으로 옮겨갔다. (PHP에서 제대로된 객체지향의 등장은 2009년인 PHP 5.3이다.) 페이스북은 이전에는 PHP를 주 언어로 사용하다가 2014년 자사에서 PHP 기반으로 개발한 hack이라는 언어를 사용한다. 관련기사
MVC 패턴[8]을 적용하기에도 어려웠다 PHP 5.3부터 객체지향 프로그래밍 요소가 들어가기 시작했다. 그러나 대다수의 CMS들은 이미 절차지향형으로 작성되어 있었고, 그밖에도 소규모 프로젝트에서는 보안관리가 힘든 경우가 많았다 예를 들어 보안패치 지원이 끝난 버전의 함수를 사용한 제로보드를 사용하다 일어난 뽐뿌 개인정보 해킹 사건 등이 있다.
MVC 패턴[8]을 적용하기에도 어려웠다 PHP 5.3부터 객체지향 프로그래밍 요소가 들어가기 시작했다. 그러나 대다수의 CMS들은 이미 절차지향형으로 작성되어 있었고, 그밖에도 소규모 프로젝트에서는 보안관리가 힘든 경우가 많았다 예를 들어 보안패치 지원이 끝난 버전의 함수를 사용한 제로보드를 사용하다 일어난 뽐뿌 개인정보 해킹 사건 등이 있다.
3.1. 모던 PHP [편집]
2000년에 나온 PHP 4까지는 클래스가 있어도 지원되는게 적어서 객체 지향적으로 만들기 어려웠지만 2009년에 PHP 5.3이 나오면서 개선됐다. 그 덕분에 PHP 4까지는 정말 순수하게 스크립트 형태로 작성된 코드들이 많았는데, PHP 5.3 이후로는 점점 객체 지향 프로그래밍이 적용되기 시작했다 덕분에 PHP의 최초 개발당시[9] 주요 사용 대상이었던 프로그래밍 언어를 정식으로 배우지 않은 사람들 입장에서는 PHP의 최대 장점이었던 낮은 진입장벽이 높아지고 있다고 우려하는 사람들도 있었을 정도. [10] 그래서 5.3버전까지를 고전 PHP, 5.4~5.6까지 과도기이며 7.0 그 이후 버전은 현대 PHP로 분리해서 보는 시각이 있다.
PHP 프레임워크들이 등장하면 MVC 패턴, HMVC 등 이 적용되면서 협업관련 문제는 대부분 해소되었으며 PHP 7부터는 좀 더 확실한 OOP 언어에 가까워졌다. 현존하는 문제들의 대다수는 아직도 5.x 대에서 벗어나지 못하는 절차지향적으로 작성된 CMS들과 여기에 익숙해져 새로운것을 배우지않는 사용자, 개발자들이 원인이다. 특히 Laravel 프레임워크가 대중화되어 많이 사용되고 있다. XE도 버전 3부터 적용하였다. 추가로 PHP Framework Interop Group에서 제안한 PSR 규칙[11]으로 인해 많은 프레임워크들이 정형화되었다. 이제 PHP 개발에서는 PSR 규칙을 지키는게 권장된다.
웹호스팅 쪽에서는 PHP가 강세이다. 대부분의 웹호스팅이 PHP를 기본적으로 지원하고 있다. 다만 최신 버전 지원이 늦는 경우가 많다. 2020년 현재에도 이미 지원종료된 7.0에 머물러 있는 웹호스팅이 좀 많다. JSP의 경우에는 컴파일 언어인 자바를 쓰기쉽게하는 템플릿엔진인데 아파치나 IIS 말고도 톰캣이란 서버 컨테이너를 설치하고 코드가 갱신될 때마다 컴파일 해야한다. ASP.NET 즉 .NET은 리눅스에서도 지원되지만[12] 마이크로소프트의 운영체제와 IIS로 운영할때가 적합하며 이때는 라이센스비용이 비싸다 .
PHP는 느슨한 타입 검사와 $GLOBALS, extract() 같은 전역변수 접근 등에서 보안 취약점 문제가 많이 지적 되었다. 타입강화는 PHP 7부터 개선된 부분이 있지만, 초창기부터 이어져 온 특유의 함수들 비일관성은 여전하다. PHP 8.1 부터는 일부 문제가 되었던 $GLOBALS 변수 사용을 인터프리터 차원에서 제한하기로 바뀌었다.
모던 PHP라고 하는 PHP 7.0 이 나오기 이전까지는 제대로 된 디자인 패턴이나 프레임워크가 확립되지 않았고, 이로 인해 보안 따위 가볍게 날려버린 코드를 짜는 방법들이 있어서 그걸 쓰는 개발자들이 많았는데 "PHP는 안전하지 않다"라는 이미지를 심는 데 일조하였다. 결론을 말하자면, PHP 개발자는 고도의 생산성을 받는 대신 '자기 스스로' 코드의 보안성에 대해 신경을 써야 한다는 이야기다.
웹에 올라와 있는 PHP 비판 문서는 유심히 봐야 한다. 잘못된 내용을 기재하는 경우도 있고, 현시점에서 해결된 문제도 떡하니 올려놓는 경우도 많다. 7.0이 나오기 이전 당시 버전이 5.x 시절에 작성된 글이 많기도 하다. 특히 PHP: 잘못된 디자인의 프랙탈의 번역본이 국내 웹에 많이 퍼져 있는데, 이 글은 2012년에 작성되어서 현 시점에서는 많은 부분이 달라졌고, 아마추어 개발자가 주관적인 개인의견을 블로그에 쓴 글이라 객관적이지 못한 글이다.
다른 플랫폼처럼 모듈화 생태계를 지원하기 위해 Composer라는 의존성 관리 도구가 나와 패키지 구성과정을 간소화 할 수 있게 되었다. PHP 패키지는 주로 패키지스트에서 찾을 수가 있다. https://packagist.org/
PHP 프레임워크들이 등장하면 MVC 패턴, HMVC 등 이 적용되면서 협업관련 문제는 대부분 해소되었으며 PHP 7부터는 좀 더 확실한 OOP 언어에 가까워졌다. 현존하는 문제들의 대다수는 아직도 5.x 대에서 벗어나지 못하는 절차지향적으로 작성된 CMS들과 여기에 익숙해져 새로운것을 배우지않는 사용자, 개발자들이 원인이다. 특히 Laravel 프레임워크가 대중화되어 많이 사용되고 있다. XE도 버전 3부터 적용하였다. 추가로 PHP Framework Interop Group에서 제안한 PSR 규칙[11]으로 인해 많은 프레임워크들이 정형화되었다. 이제 PHP 개발에서는 PSR 규칙을 지키는게 권장된다.
웹호스팅 쪽에서는 PHP가 강세이다. 대부분의 웹호스팅이 PHP를 기본적으로 지원하고 있다. 다만 최신 버전 지원이 늦는 경우가 많다. 2020년 현재에도 이미 지원종료된 7.0에 머물러 있는 웹호스팅이 좀 많다. JSP의 경우에는 컴파일 언어인 자바를 쓰기쉽게하는 템플릿엔진인데 아파치나 IIS 말고도 톰캣이란 서버 컨테이너를 설치하고 코드가 갱신될 때마다 컴파일 해야한다. ASP.NET 즉 .NET은 리눅스에서도 지원되지만[12] 마이크로소프트의 운영체제와 IIS로 운영할때가 적합하며 이때는 라이센스비용이 비싸다 .
PHP는 느슨한 타입 검사와 $GLOBALS, extract() 같은 전역변수 접근 등에서 보안 취약점 문제가 많이 지적 되었다. 타입강화는 PHP 7부터 개선된 부분이 있지만, 초창기부터 이어져 온 특유의 함수들 비일관성은 여전하다. PHP 8.1 부터는 일부 문제가 되었던 $GLOBALS 변수 사용을 인터프리터 차원에서 제한하기로 바뀌었다.
모던 PHP라고 하는 PHP 7.0 이 나오기 이전까지는 제대로 된 디자인 패턴이나 프레임워크가 확립되지 않았고, 이로 인해 보안 따위 가볍게 날려버린 코드를 짜는 방법들이 있어서 그걸 쓰는 개발자들이 많았는데 "PHP는 안전하지 않다"라는 이미지를 심는 데 일조하였다. 결론을 말하자면, PHP 개발자는 고도의 생산성을 받는 대신 '자기 스스로' 코드의 보안성에 대해 신경을 써야 한다는 이야기다.
웹에 올라와 있는 PHP 비판 문서는 유심히 봐야 한다. 잘못된 내용을 기재하는 경우도 있고, 현시점에서 해결된 문제도 떡하니 올려놓는 경우도 많다. 7.0이 나오기 이전 당시 버전이 5.x 시절에 작성된 글이 많기도 하다. 특히 PHP: 잘못된 디자인의 프랙탈의 번역본이 국내 웹에 많이 퍼져 있는데, 이 글은 2012년에 작성되어서 현 시점에서는 많은 부분이 달라졌고, 아마추어 개발자가 주관적인 개인의견을 블로그에 쓴 글이라 객관적이지 못한 글이다.
다른 플랫폼처럼 모듈화 생태계를 지원하기 위해 Composer라는 의존성 관리 도구가 나와 패키지 구성과정을 간소화 할 수 있게 되었다. PHP 패키지는 주로 패키지스트에서 찾을 수가 있다. https://packagist.org/
4. 구동방식 [편집]
PHP는 인터프리터방식이면서 실행후 프로세스가 끝나고 다음 실행시 코드를 매번 해석해서 실행하는 방식이라 퍼포먼스에 한계가 있었다. 그래서 PHP 코드를 최대한 그대로 재활용하되 컴파일링을 통해 퍼포먼스를 향상시키는 소프트웨어들이 몇 가지 개발되었는데 그중에서 opcode 캐시가 5.5버전부터 PHP 엔진에 통합되었다.
페이스북은 자사 서비스를 개발하다가 PHP의 성능 문제를 해소하기 위해 오픈 소스로 HipHop for PHP와 HipHop Virtual Machine(HHVM)을 개발했다. 전자는 PHP 코드를 C++ 코드로 변환한 뒤 컴파일하는 방식이고, 후자는 Java와 비슷하게 JIT 컴파일링을 하는 방식이다. 현재 HipHop for PHP는 개발을 중단하고 HHVM만 개발하여 내놓고 있다. 참고로 페이스북은 HHVM을 개발하면서 hack이라는 프로그래밍 언어도 만들었는데, HHVM에서 hack 언어로 작성된 코드도 실행할 수 있다.
그런데 PHP 7.0에서는 인터프리터와 파서를 분리하고 AST 파서를 도입해서 HHVM의 강점인 속도를 따라잡았다. 2020년 말에 출시된 PHP 8부터는 인터프리터에 JIT 을 도입하여 JIT 구동여부에 따라 7.4대비 2배 가량의 성능 향상이있다.벤치마크
페이스북은 자사 서비스를 개발하다가 PHP의 성능 문제를 해소하기 위해 오픈 소스로 HipHop for PHP와 HipHop Virtual Machine(HHVM)을 개발했다. 전자는 PHP 코드를 C++ 코드로 변환한 뒤 컴파일하는 방식이고, 후자는 Java와 비슷하게 JIT 컴파일링을 하는 방식이다. 현재 HipHop for PHP는 개발을 중단하고 HHVM만 개발하여 내놓고 있다. 참고로 페이스북은 HHVM을 개발하면서 hack이라는 프로그래밍 언어도 만들었는데, HHVM에서 hack 언어로 작성된 코드도 실행할 수 있다.
그런데 PHP 7.0에서는 인터프리터와 파서를 분리하고 AST 파서를 도입해서 HHVM의 강점인 속도를 따라잡았다. 2020년 말에 출시된 PHP 8부터는 인터프리터에 JIT 을 도입하여 JIT 구동여부에 따라 7.4대비 2배 가량의 성능 향상이있다.벤치마크
5. 개발 도구 [편집]
구버전 PHP를 쓰는 경우에는 통합 개발 환경(IDE)을 안 쓰는 곳이 종종 있는데, 오류를 잡고 개발 생산성을 높이기 위해서는 IDE를 쓰는 것이 좋다. VS Code 같은 텍스트 에디터에 디버깅을 위한 Xdebug를 설치해서 사용하는 방법도 있다. 특히 VS Code는 MS가 전폭적으로 밀어주고 있어 각종 플러그인의 숫자도 늘어나는 중이다.
요즘엔 JetBrains 사에서 개발한 유료 IDE PhpStorm이 편리한 코드 에디터, 각종 프레임워크 지원, 신속한 서포트에 힘입어 점유율을 늘려가고 있다. PhpStorm은 PHP뿐만 아니라 JavaScript 및 웹 관련 기능들까지 전부 포함하고 있다.
요즘엔 JetBrains 사에서 개발한 유료 IDE PhpStorm이 편리한 코드 에디터, 각종 프레임워크 지원, 신속한 서포트에 힘입어 점유율을 늘려가고 있다. PhpStorm은 PHP뿐만 아니라 JavaScript 및 웹 관련 기능들까지 전부 포함하고 있다.
6. PHP 코딩 표준안 [편집]
PHP 5.3 이후 PHP 진영에도 프레임워크들이 나오면서 코딩표준과 프레임워크들 호환에관해 PHP 프레임워크 그룹에서 규칙을 정했다.
PSR 0 ~ 17까지 있으나 PSR 4 와 12가 주요규칙이고 PSR 4에서 PHP 클래스를 자동으로 불러오는 오토로드 라는 게 있는데 Node.js계의 NPM과 같은 패키지 의존성 관리자인 컴포저가 구현체이다.
PSR 한국어 번역문서
그 밖에 PHP The Right Way라는 문서가 인정받고 있다. 한국어 번역https://modernpug.github.io/php-the-right-way/
PSR 0 ~ 17까지 있으나 PSR 4 와 12가 주요규칙이고 PSR 4에서 PHP 클래스를 자동으로 불러오는 오토로드 라는 게 있는데 Node.js계의 NPM과 같은 패키지 의존성 관리자인 컴포저가 구현체이다.
PSR 한국어 번역문서
그 밖에 PHP The Right Way라는 문서가 인정받고 있다. 한국어 번역https://modernpug.github.io/php-the-right-way/
7. 업데이트 [편집]
PHP의 공식 업데이트는 7.0이 나온 이후로 최신 버전 및 하위 2개 버전까지만 업데이트를 유지한다. 예를 들어 7.4가 나오면 7.3과 7.2는 업데이트를 지속하고, 7.1은 업데이트를 종료하는 형식이다. 그러나 많이 쓰이는 몇몇 리눅스의 배포판(대표적으로 레드햇 리눅스와 CentOS, 우분투)은 PHP의 업데이트가 종료된 이후에도 자체적으로 계속 보안 업데이트를 지원하는데, 이런 유명 배포판들은 보통 서버용으로 써서 지원 기간이 긴 경우가 많고(특히 LTS로 불리는 장기지원 버전), 호환성을 위해 해당 메이저 버전 내에서는 공식 저장소의 PHP 버전을 바꾸지 않기 때문에 자체적으로 보안 업데이트를 지원하는 것이다. PHP는 웹서버이니 보안이 패치된 최신 버전을 쓰는것이 좋다.
7.1. PHP 5 [편집]
PHP 5가 처음 나온 것이 2004년으로 거의 10년이 넘었는데, 사실 2005년부터 PHP 6에 대한 개발이 시작되었다. 하지만 이게 취소되는 바람에 PHP 5로 근 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의 호환성을 최대한 유지한 상태로 넘어가기 때문에 혼란은 많지 않았다서
7.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 정식 버전이 발표되었다. # AST 파서가 적용되었고 메모리 사용량이 감소했다.
실제로 여러 사용자와 벤치마크에 의하면 PHP 7은 이전 보다 2배에서 10배까지도 빠르다고 한다.이전 방식 $user = (!empty($_GET['user'])) ? $_GET['user'] : ''; // 삼항연산자로 처리 ? 앞에 값이 있으면 대입하고 없으면 뒤에 것을 쓴다. PHP7.0 부터는 같은 표현식이 간단해진다. $user = $_GET['user'] ?? ''; // ??(null 병합연산자) 앞에 변수가 없으면 뒤에것을 쓴다.
- 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월 1일, PHP 7.0 버전 지원이 완전히 종료되었다.
- 2018년 12월 6일, PHP 7.3 정식 버전을 발표하였다. Heredoc, Newdoc 문법이 유연해졌고, 함수 호출 시 마지막 파라미터 뒤에 콤마를 붙이는 것이 가능해졌다.
- 2018년 12월 31일, PHP 5.6 버전의 지원이 완전히 종료되었다. 이로써 PHP 5.x 버전은 15년간의 길고 긴 역사를 마감하게 되었다.
- 2019년 11월 26일, PHP 7.4 정식 버전이 발표되었다. 성능이 최대 8%의 향상 되었다. 그리고 며칠 후인 12월 1일에 PHP 7.1 버전 지원이 종료되었다.
7.3. PHP 8 [편집]
- 2020년 PHP 8에서 성능향상을 위한 JIT 도입, 정의되지 않은 변수 검사 등 예외처리 강화가 되었다.
특히 에러를 일시적으로 감추는데 사용되던 @연산자가 사라졌다. [16]
다른언어에서 옵셔널이라고도 부르는 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가 어떤역할인지 보는데 도움된다.- 2020년 11월 26일 정식 출시 되었다.
8. 기타 [편집]
- FastCGI로 프록시 하게 되면 HTTP헤더에 X-Powered-By 이름의 버전 정보가 추가된다. : X-Powered-By: PHP/7.4.2 [17]
- 현재 웹상에 공개된 많은 웹 관련 애플리케이션들이 PHP로 작성되었기 때문에, 필요한 부분을 고칠 수 있을 정도로 배워두면 도움이 된다. 특히 간단한 서버용 자동화 스크립트 파일을 짜기에도 편리하고, 웹서버를 경험해보기 괜찮은 언어이다버
- 라이선스를 보면, 일단 프리프로세서는 3.x(PHP License/GPL 듀얼 라이선스)를 제외한 모든 버전이 PHP License라 불리는 독자적 라이선스를 따른다. MIT 허가서 비스무리한 형태지만 프리프로세서를 재배포할 때 (내용 수정 여부와 관계없이) 패키지명에 PHP라는 단어를 넣지 못하게 하고, 'This product includes PHP software, freely available from http://www.php.net/software'라는 문구를 코드에 삽입할 것을 강제하는 내용이 있어 GPL과는 호환이 되지 않는다.
- 페이스북에서 PHP에 지대한 공헌을 하고 있다. 이유는 위에서 언급했듯이 페이스북이 PHP(or hack 언어) 기반으로 만들어졌기 때문.[18] 대표적으로 페이스북에서 PHP의 표준에 대해 공식화한 문서가 있다. 심지어 공식 PHP에서도 이 문서를 이용한다. 이전까지 PHP는 제대로 된 언어 사양서(php.net의 문서와는 성격이 조금 다르다)가 없었다. 즉, 마땅히 PHP 언어 개발진이 해야 할 일을 돈 한 푼 안 받고 페이스북에서 한 것이다. GitHub 페이지
9. PHP로 작성된 프로그램 목록 [편집]
나무위키에 항목이 있는 것만 추가한다. (가나다 순)
- PocketMine-MP - 마인크래프트 BE 서버 프로그램
[1] 사실 PHP는 Perl과 좀 더 유사하다. 다만 C언어에서 파생된 문법을 사용하므로 C-like로 기술하였다.[2] PHP에서는 변수를 사전에 선언할 필요가 없고, $var = 9;이면 숫자, $var = "String"; 이면 문자열 $var = true 이면 참거짓 변수로 적용되며, 이미 선언된 문자열이 + 기호를 사용하면 숫자로 인식한다.[3] 스크립트의 언어 속성으로
language를 쓰는 것 또한 사실은 비표준이다. 표준대로라면 type으로 쓰는 것이 옳다. HTML4 시절부터 두 가지 형태가 혼용되고 있었는데 HTML5에서 후자가 살아남은 것.[4] php opcache[5] 기존 함수는 지원하지만, 서서히 없애고 있다.[6] PHP 8.0에서는 보안을 위해 에러가 나도록 바뀌었다.[7] Notice 수준의 로그로 보여주는데 php.ini에서 설정을 껐을경우 모르고 지나치기 쉽다.[8] (Model)-출력(View)-입력 및 제어(Controller)에 해당하는 부분을 분리해서 작성하는 프로그래밍 방식.[9] 95~2002년[10] 그런데 루비 온 레일즈 등의 영향을 받은 다양한 MVC 패턴을 지원하는 웹 개발 프레임워크들이 개발되었기 때문에 어떻게 보면 오히려 난이도가 비슷하거나 낮아졌다고 할 수 있다. 2015년 현재 대세로 떠오르고 있는 Laravel 웹 프레임워크 같은 경우에는 GitHub에서 Python의 대표적인 웹 개발 프레임워크인 Django의 star 수를 뛰어넘었다.[11] PHP프로그램 작성 권장 규칙[12] 2016년에는 .NET의 오픈 소스 구현체인 .NET Core가 지원되기 시작했다.[13] 배열을 []로 선언하기, 배열을 리턴하는 함수를 곧바로 접근하기 등. 이것은 이미 오래전부터 JavaScript에서 구현된 것들이다. 이 외에도 JavaScript에서 유래한 일부 기능이 추가되었다.[14] call by reference[15] null coalescing operator [16] 즉 PHP 7에서 버그를 잡지않고 짜여진 코드들은 PHP8에서 문제가 드러날 가능성이 크다.[17] 여담으로 header_remove로 지울 수 있는데 지우지 않아서 프로그램 정보가 노출되면 서버 보안에 취약할 거라는 지적이 있다. #StackOverflow[18] 외국에서는 기업이 오픈소스 프로젝트를 이용하여 자사의 서비스를 구축한 경우 그 프로젝트에 기여(contribute)를 하는 일이 흔하다.[19] Taking PHP Seriously[20] 주로 프론트엔드에서 쓰였으며, 현재는 PHP를 바탕으로 자체 개발한 Hack 언어로 넘어갔다.라이선스를 별도로 명시하지 않은 문서는 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다.
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.
문서의 기여자는 역사 탭에서 확인할 수 있습니다.
접두어의 N: - 나무위키 사용자, R: - 리그베다 위키의 사용자를 뜻합니다.
자세한 사항은 나무위키에서 동일한 문서의 역사를 참고하시기 바랍니다.