PHP

PHP(PHP: Hypertext Preprocessor: 하이퍼텍스트 프리프로세서)는 범용 프로그래밍 언어다. 원래는 'Personal Home Page'의 약자였다. 동적 웹 페이지를 만들기 위해 설계되었으며 이를 구현하기 위해 PHP로 작성된 코드를 PHP 엔진에서 html 파일과 같이 처리하여 작성자가 원하는 웹 페이지를 생성한다. 2015년 PHP 7.0이후에는 PHP 코드와 HTML을 별도 파일로 분리하여 작성하는 경우가 일반적이며, PHP 또한 웹서버가 아닌 php-fpm(PHP FastCGI Process Manager)을 통해 실행하는 경우가 많다. 또한 PHP는 명령 줄 인터페이스 방식의 자체 인터프리터를 제공하여 이를 통해 범용 프로그래밍 언어로도 사용할 수 있으며 그래픽 애플리케이션을 제작할 수도 있다. 많은 서버 측 오픈 소스 소프트웨어는 PHP로 구현되었다. PHP를 바탕으로 하는 프로그램 중 대표적인 예로 블로깅 도구 워드프레스와 위키백과를 구동시키는 미디어위키를 들 수 있다. 대한민국의 PHP 기반 BBS는 그누보드, XpressEngine, 라이믹스 등이 있다. PHP는 마이크로소프트의 ASP.NET, 비주얼 베이직, 매크로미디어의 콜드퓨전, 오라클의 자바나 오픈 소스 커뮤니티의 파이썬, 펄, 루비에 대한 대안으로 생각될 수 있다. PHP는 텍스트, 특히 HTML의 처리에 강점을 가지고 있다. URL의 파싱이나 폼 처리, 정규 표현식 등이 그 한 예이다. 또한 다양한 데이터베이스를 지원하므로 데이터베이스와 사용자간의 다리 역할도 잘 수행한다. PHP는 PHP 사용 허가서의 규정을 따라 릴리즈된 자유 소프트웨어이다. 그러나 PHP 사용 허가서는 PHP라는 단어의 사용에 제한을 두는 규정을 가지고 있기 때문에 GNU 일반 공중 사용 허가서와 호환되지 않는다. PHP는 1995년 덴마크계 캐나다인 라스무스 러도프가 처음 만든 것으로, 당시 C언어나 Perl로 복잡하게 웹사이트를 만들던 CGI를 대신해 간편하게 웹사이트를 작성하기 위해 개발했다. 그 뒤로 젠드 사에서 PHP VM 을 개발했고 범용프로그래밍 언어에 이르게 되었다. 1995년 6월 8일 발표. 라스무스 러도프가 C 언어로 작성한 PHP(Personal Home Page Tools) 인터프리터의 소스 코드를 공개한다. 1996년 4월 16일 발표. FI(Form Interpreter, SQL이 만든 DBMS 도구)가 통합되어 1997년에 PHP/FI2.0이 된다. 정식 명칭은 "Personal Home Page Construction Kit/Form Interpreter"이다. 1998년 6월 6일 발표. PHP/FI를 기반으로, 앤디·가트만즈와 제이브·스라스키에 의해 PHP3(PHP:Hypertext Preprocessor)로 업데이트되었다. 2000년 5월 22일 발표. PHP3를 큰 폭으로 기능을 확장하고 Zend 엔진을 도입하였다. 2001년 12월 10일 발표. 슈퍼 전역 변수가 추가된다. 2002년 4월 22일 발표. 보안 취약하다는 근거로 register_globals의 초기값이 Off로 변경된다. 2002년 12월 27일 발표. 명령 줄 인터페이스가 추가된다. 2005년 7월 11일 발표. 같은 날 PHP4의 지원을 2007년 12월 31일에 종료한다고 고지했다. 중대한 보안문제에 관한 수정만, 2008년 8월 8일까지 계속되어 그 후 모든 지원을 종료했다. 2005년 7월 13일 발표. 의사적인 객체 지향이 한층 강화됨과 동시에 클래스 라이브러리로서 SPL가 지원되었다. 또, SQLite 가 표준으로 장착되게 되었다. Zend 엔진 2.0을 도입했다. 2005년 11월 24일 발표. 실행 속도가 개선되고 PDO 확장 기능이 추가된다. 2006년 11월 2일 발표. 확장 모듈에 필터(Filter)가 기본으로 추가. JSON 을 쉽게 인코딩, 디코딩할 수 있는 함수 추가. 2009년 6월 30일 발표. 아래의 기능이 추가되었다. 이름공간 (Namespace) 지연 정적 바인딩(Late static bindings) goto 클로저(Native closures) ?: 연산자 가비지 컬렉션(garbage collection) 2012년 3월 1일 발표. 단일 상속의 한계를 없앤 트레이트와 짧은 배열 구문이 추가되었다. 개발용 웹서버가 내장되었다. register Global 이 삭제되었다. 램 사용량이 줄어들었다. safe mode 가 삭제되었다. <?= 표기가 설정에 관계없이 항상 쓸 수 있게 되었다. 함수 사용후 배열에서 인덱스를 바로 붙여쓸 수있게 되었다. 예) foo()[1] 2013년 6월 20일 발표. 아래의 기능들이 추가 또는 변경되었다. 제너레이터(Generators) finally 키워드 강화된 패스워드 해슁 함수 배열과 문자열의 디레퍼런싱 상수 클래스명 ::class empty() 함수가 수식을 지원 foreach 내 이터레이터(Interator)로 논스칼라(non-scalar) 사용 foreach 구문에 list() 사용 op코드 캐시를 위한 Zend OPcache 내장 2014년 8월 28일 발표. 아래의 기능들이 추가되었다. 선언에 상수 표현식 지원 가변길이 인수에 대한 문법 (...$args) 매개변수 해체(argument unpacking) 거듭제곱 연산자 (**) 추가적인 use 문 (use function, use const) SAPI 모듈을 위한 새로운 phpdbg 디버거 2015년 12월 1일 공개되었다. 특징은 다음과 같다. 파서 재작성으로 성능 향상 - PHP 5.6 보다 두배 이상 빠른 속도 변수최적화로 메모리 사용률이 상당히 감소 PHP 5.6 대비(1/5)로 감소 추상 구문 트리(Abstract Syntax Tree) 일관된 64비트 지원(Consistent 64-bit support) 향상된 예외 상속(Improved Exception hierarchy) 많은 치명적 에러들이 예외로 전환 됨 보안 난수 발생기(Secure random number generator) 오래 됐거나 지원하지 않는 SAPI와 확장 지원 중단 Null 병법 연산자(The null coalescing operator (??)) 함수에 리턴 타입정의, 매개변수에 스칼라 타입 정의가능 익명 클래스(Anonymous Classes) Zero cost asserts 2016년 12월 3일 공개되었다. 추가된 특징은 다음과 같다. 함수리턴과 매개변수에 Nullable 지정(Nullable Type) 리턴 타입에 이터러블과 Void 지원(Iterable and Void Returns) try catch 구문에서 catch 에 한번에 여러익셉션 감지 list 함수에서 key 사용가능 배열의 인덱스에 음수사용가능 이터러블타입인지 확인하는 is_iterable() 함수 2017년 11월 30일 공개되었다. 보안패치 종료기간은 2020년 11월 30일까지이다. 주요 특징은 다음과 같다. PHP 7.1 대비 10%의 성능향상 함수의 리턴과 매개변수의 타입으로 object 지정가능. 추상클래스의 추상매서드를 오버라이딩 가능 Argon2 해시함수 지원 클래스 오토로딩함수 __autoload -> spl_autoload_register 로 전환 each 함수 삭제예고됨 (이터러블로 대체권장) 2018년 12월 8일 공개되었다. 보안패치지원 종료기간은 2021년 12월 6일이다. PHP 7.2 대비 성능이 5% 향상되었다. FastCGI의 로그 작성이 최적화되었다. 기존 여러줄 작성가능한 문법 Heredoc, Nowdoc의 유연화 배열의 마지막요소에 , 가능(Trailing commas) 어떤 변수가 셀수있는 타입인지 체크강화 어떤 변수가 셀수있는 타입인지 체크하는 is_countable() 함수 추가 samesite 쿠키 지원 list 함수의 기본동작이 참조전달(call by references) ->값 복사(call by value) 로 전환 기존처럼 참조변수 전달시 & 명시 정규식엔진을 PCRE -> PCRE2로 전환 2019년 11월 28일 공개되었다. 보안패치지원 종료날짜는 2022년 11월 28일이다. 프리로딩기능이 추가되어서 로딩성능이 10%향상되었다. 기본값은 off이므로 php.ini에서 수동으로 켜야한다. 람다식이라고도 부르는 화살표함수 추가(Arrow functions) 함수 축약표현식 fn 문법 추가 클래스를 미리 메모리에 로딩하는 프리로딩 추가 (Preloading) 클래스 프로터티에 타입명시 가능 PHP 코어의 타입시스템 개선 (Improved type variance) Null 병합연산자 추가 (?? 물음표가 두개이다.) (Null coalescing) 배열 전개연산자 추가 (Array spread operator) 외부 함수 인터페이스 FFI 추가로 다른언어(c나 러스트, go등)으로 작성된 라이브러리 로딩가능 사용자 정의 객체의 직렬화 가능 삼항연산자 중첩시 왼쪽부터 평가되게 전환예고(언어의 비일관성 개선) 2020년 11월 26일 출시 되었다. 보안패치 지원 종료일은 2023년 11월 26일이다. PHP 에도 JIT 컴파일러가 도입되어 성능이 최대 2배까지 향상되었다. 이름있는 파라미터가 추가되었다.(Named arguments) 애트리뷰트가 추가되었다. 다른언어에서는 어노테이션이라고도 한다. 열거형을 쓸 수있게되었다. Match 표현식이 추가되어 함수형프로그래밍에 한걸음 더 다가서게되었다. Null 안전한 연산자가 추가되었다. 다른언어에서는 옵셔널이라고도 한다. 문자열 함수에 str_contains(), str_starts_with(), str_ends_with() 등 편리한 함수가 추가되었다. Throw 문법은 표현식으로 바뀌었다. 그 밖에 타입오류 문구와 예외처리가 일관성 있게 개선되었다. 다음은 예전에 코미디 프로그램에서 유행했던, 빛나리의 타잔 노래 가사를 출력해주는 코드이다. 이와 같이 PHP 구문은 일반적인 HTML 문서에 삽입되어 동작하게 되어 있으며, 여기서는 <?php ~ ?> 사이의 내용이 PHP 코드로 해석된다. <html> <head> <title>php example </title> </head> <body> <h1>빛나리의 타잔 주제가</h1> <p> <?php $price = 10; $limit = 10000; while($price < $limit) { echo '타잔이 '.$price.'원짜리 팬티를 입고,<br />'."\r\n"; $price += 10; echo $price.'원짜리 칼을 차고 노래를 한다. 아~~!<br />'."\r\n"; } ?> </p> </body> </html> 또한, 간단한 템플릿 기능도 지원한다. 다만 이는 언어의 기능이라기보다는 하나의 트릭에 가까우며, 로직과 디자인이 완전히 분리되지 않는 문제점이 있다. 따라서 본격적인 템플릿 기능에는 Smarty 등의 전문 템플릿 엔진이 많이 사용된다. 다음은 템플릿을 써서 비슷한 결과를 출력하는 PHP 코드이다. (HTML 생성물은 위와 다르지만 화면 출력되는 모습은 같다.) <?php $price = 10; $limit = 10000; ?> <html> <head> <title>빛나리의 타잔 주제가</title> </head> <body> <h1>빛나리의 타잔 주제가</h1> <p> <?php while($price < $limit): ?> 타잔이 <?= $price ?>원짜리 팬티를 입고,<br /> <?= $price + 10 ?>원짜리 칼을 차고 노래를 한다. 아~~!<br /> <?php endwhile; ?> </p> </body> </html> 근본적으로, PHP의 문법은 C스타일을 따른다. 변수는 $기호가 앞에 붙은 단어로 나타내며 함수는 함수 이름(매개변수)의 형식으로 나타낸다. 함수를 선언할 때에는 function이라는 키워드를 앞에 붙여야 한다. .(Dot) 연산자는 문자열 결합 연산자이며, 구조체 참조 연산자는 ->로 통일된다. 포인터를 제공하지 않으며 기본 매개변수 값은 값에 의한 전달(Call by value)이다 다만 &를 이용해 명시적으로 참조 전달을 선언할 수도있다. 그 외 class 관련 문법이 C++과 다르다. PHP의 장점은 기존까지 존재해 왔던 언어에 비해 `직관적`이라는 것이었다. 현재는 이런 인기 후, 유사하거나 더욱 개성이 강한 스크립트 언어들이 '웹 개발'을 위해 태어나게 된다. PHP의 특징 중 하나는 무상태성이며 PHP 스크립트는 명령을 수행한뒤 모든작업이 종료된다. 자바나 C 언어에서 접근하려면 여러 Include 등을 통해야 했던 작업들이 내장함수로 있어서 '그냥 적어 놓기만' 하면 작동을 한다. 즉 작성 코드의 양이 현저히 적다는 것이다. 그래서 직관적인 코드작성을 가능하게 하고 이것은 소스코드를 '절차적 프로그램 코드'에 가깝도록 만든다. 현재의 PHP는 절차적인 형태에서 '객체지향(클래스- Class)' 프로그램 작성이 가능한 상태로 진화된 상황이고 이런 진화하에서 라라벨, 심포니 등 웹 프레임워크들이 등장할 수있게되었다. PHP 가 처음에는 C 언어의 함수들을 차용하여 이름이 일정했지만 나중에 추가된함수들은 일관되지않게 되었고 객체지향이 추가되면서 스네이크케이스와 카멜케이스등이 혼용되는 등 약간의 혼란이 생긴다는 의견이있다. PHP 표준자료구조인 SPL 의 arrayObject 등이 기본배열보다 느리고 확장성이 떨어지는등 제 구실을 못하고 있어서 대게 PHP 개발에서는 기본 연관배열을 사용한다. PHP는 기존에, 사람들이 생각해오지 않았던 방향으로도 발전해가고 있었다. 웹으로 구현되리라 생각해오지 않았던 ERP, CRM 등의 경영에 관련한 프로그램이 개발하고 있다. PHP로 작성되어 출시된 프로그램은 워드프레스, XpressEngine, 태터툴즈, PHPBB, 드루팔, 라이믹스 제로보드, 그누보드, 테크노트, 심포니, 라라벨 등이 있다. 이 프로그램들은 소스가 오픈된 채 출시된 프로그램이 많다. 그리고 이 프로그램들은 개인 서버에 설치하여도 활용이 가능한 경우가 있으며, 개인/기관의 차원을 넘어, 그 활용의 형태로는 커뮤니티 사이트, 블로그 등을 들 수 있다. 상용 프로그램들은 CRM, ERP 등, 즉, 기업 경영에 활용하기 좋은 형태로, 수많은 프로그램들이 실용화된다. 이것은 기존의 C언어와 같은 언어에서처럼 모듈로 존재하기도 한다. 위키미디어 공용에 관련된 미디어 분류가 있습니다. PHP LAMP (소프트웨어 번들) 라라벨 심포니 (웹 프레임워크) 코드이그나이터 “Version 8.3.12”. 2024년 9월 26일. 2024년 9월 26일에 확인함.  재귀 약자를 사용하고 있다. http://www.php.net/manual/en/history.php.php “Unsupported Branches”. 《php.net》. 2019년 7월 31일에 확인함.  “PHP 4.0.0 Released”. 2020년 10월 25일에 확인함.  “PHP 4.1.0 Release Announcement”. 2020년 10월 25일에 확인함.  “PHP 4.2.0 Release Announcement”. 2020년 10월 25일에 확인함.  “PHP 4.3.0 Release Announcement”. 2020년 10월 25일에 확인함.  “PHP 4.4.0 Release Announcement”. 2020년 10월 25일에 확인함.  “PHP 5.0.0 Released!”. 2020년 10월 25일에 확인함.  “PHP 5.1.0 Release Announcement”. 2020년 10월 25일에 확인함.  “PHP 5.2.0 Release Announcement”. 2020년 10월 25일에 확인함.  “PHP 5.3.0 Release Announcement”. 2020년 10월 25일에 확인함.  “PHP 5.4.0 Release Announcement”. 2020년 10월 25일에 확인함.  “PHP 5.5.0 Release Announcement”. 2020년 10월 25일에 확인함.  “Supported Versions”. 《php.net》. 2017년 12월 13일에 확인함.  “PHP 5.6.0 Release Announcement”. 2020년 10월 25일에 확인함.  “News Archive – 2018: PHP 7.2.9 Released”. 《php.net》. 2018년 8월 16일. 2018년 8월 16일에 확인함.  “PHP: Release Process”. 2011년 6월 20일. 2013년 10월 6일에 확인함.  “PHP: todo:php73”. 《wiki.php.net》.  “PHP 7.4.0 Released!”. 《php.net》. 2019년 11월 28일에 확인함.  “PHP: todo:php80”. 《wiki.php.net》. 2020년 6월 16일에 확인함.  “PHP: todo:php81”. 《wiki.php.net》. 2022년 6월 16일에 확인함.  “PHP: todo:php82”. 《wiki.php.net》. 2022년 6월 16일에 확인함.  “PHP: todo:php83”. 《wiki.php.net》. 2022년 11월 28일에 확인함.  https://ivan.bessarabov.com/blog/php-was-not-written-in-perl http://groups.google.com/group/comp.infosystems.www.authoring.cgi/msg/cc7d43454d64d133 “보관된 사본”. 2006년 7월 19일에 원본 문서에서 보존된 문서. 2006년 9월 19일에 확인함.  “Django vs. PHP: Who Will win the Battle of Backend Dominance?” (미국 영어). 2021년 2월 10일. 2021년 8월 19일에 확인함.  루비온레일즈 JSP, ASP, Java PHP - 공식 웹사이트 Paul Ford (2015년 6월 11일). “What is Code?”. 《Bloomberg Businessweek》. What's the Absolute Minimum I Must Know About PHP?  (영어) PHP - Curlie