PHP
PHP 는 주로 웹 개발 용으로 설계된 서버 측 스크립팅 언어 이지만 범용 프로그래밍 언어 로도 사용 됩니다 . 원래 1994 년 에 Rasmus Lerdorf 에 의해 만들어졌으며 PHP 레퍼런스 구현 은 PHP 개발팀에 의해 만들어졌습니다. [5] PHP는 원래 위해 서 개인 홈 페이지 , 하지만 지금의 약자 재귀 적 약어의 하이퍼 텍스트 전 처리기 : PHP .
PHP 코드는 HTML 또는 HTML5 마크 업 에 포함되거나 다양한 웹 템플리트 시스템 , 웹 컨텐트 관리 시스템 및 웹 프레임 워크 와 함께 사용될 수 있습니다 . PHP 코드는 일반적으로 웹 서버 의 모듈 또는 CGI ( Common Gateway Interface ) 실행 파일 로 구현 된 PHP 인터프리터에 의해 처리됩니다 . 웹 서버 소프트웨어로 생성 된 이미지를 포함하는 데이터의 임의의 타입 일 수있는 해석되고 실행될 PHP 코드의 조합 결과 웹 페이지 . PHP 코드는 명령 행 인터페이스 로 실행될 수도 있습니다.(CLI)이며 독립형 그래픽 응용 프로그램 을 구현하는 데 사용할 수 있습니다 .
에 의해 구동 표준 PHP 인터프리터, 젠드 엔진 이며, 무료 소프트웨어 언더 발표 PHP 라이센스 . PHP는 널리 포팅되어 거의 모든 운영체제 와 플랫폼 에서 대부분의 웹 서버에 무료 로 배포 할 수 있습니다 .
PHP 언어 는 정식 PHP 인터프리터를 사실상의 표준 으로 남겨둔 채 2014 년까지 공식 표준 이나 표준 없이 작성 되었습니다 . 2014 년 이래로 공식 PHP 사양을 작성했습니다.
역사
초기의 역사
PHP 3을 구성한 파서 를 다시 작성한 Andi Gutmans ( 중간)와 Zeev Suraski (오른쪽) 와 함께 원래의 Common Gateway Interface (CGI) 구성 요소 를 작성한 Rasmus Lerdorf (왼쪽) .
때 PHP 개발은 1995 년에 시작 라스무스 레르도프 여러 썼다 공용 게이트웨이 인터페이스 C에서 (CGI) 프로그램을, [10] [11] [12] 그의 유지하는 데 사용 개인 홈페이지 . 웹 폼 작업 및 데이터베이스 와의 통신 을 위해 이들을 확장 하고이 구현을 "Personal Home Page / Forms Interpreter"또는 PHP / FI라고했습니다.
PHP / FI는 간단하고 동적 인 웹 애플리케이션 을 구축하는 데 도움이 될 수 있습니다. 버그 보고 를 가속화 하고 코드를 개선하기 위해 Lerdorf는 처음에 유즈넷 토론 그룹 comp.infosystems.www.authoring.cgi 에서 "개인 홈 페이지 도구 (PHP 도구) 버전 1.0"으로 PHP / FI의 릴리스 를 2008 년 6 월 8 일에 발표했습니다. 1995. [13] [14] 이 릴리스에는 PHP가 2013 년에 이미 가지고있는 기본 기능이 있습니다. 여기에는 Perl과 유사한 변수 , 양식 처리 및 HTML을 포함 할 수있는 기능이 포함되었습니다. 구문은 펄의 닮은하지만, 간단하게 더 제한하고 덜 일치했다. [5]
Lerdorf는 초기 PHP가 새로운 프로그래밍 언어가 될 의도는 없었지만, Lerdorf가 회고 적으로 다음과 같이 지적하면서 유기적으로 성장했습니다. "어떻게 멈추는 지 모르지만 프로그래밍 언어를 작성하려는 의도는 전혀 없었습니다. [...] I 프로그래밍 언어를 작성하는 방법을 전혀 모르는 채로, 나는 그 길에 다음 논리적 인 단계를 계속 추가했다. " [15] 개발 팀이 형성되기 시작했으며 , 1997 년 11 월 PHP와 FI 2 공식 발표 와 베타 테스트를 거쳤습니다.
PHP가 원래의 전체적인 디자인이 없었지만 대신 유기적으로 개발됨에 따라 함수의 이름이 일관되지 않고 매개 변수의 순서가 일관되지 않게되었습니다. [16] 어떤 경우에는 함수 이름이 PHP가 "wrapping"하는 하위 라이브러리와 일치하도록 선택 되었지만 [17] PHP의 초기 버전에서는 함수 이름의 길이가 내부적으로 해시 함수 로 사용되었습니다 그래서 해시 값의 분포를 향상시키기 위해 이름이 선택되었습니다. [18]
PHP 3과 4
Zeev Suraski 와 Andi Gutmans 는 1997 년 파서 를 다시 작성하여 PHP 3의 기본을 구성하여 언어 이름을 재귀 적 약어 인 PHP : Hypertext Preprocessor로 변경했습니다 . [5] [19] 이후, PHP 3의 공개 테스트를 시작하고, 수라 스키와 거트 먼스는 다음 새로운 시작 1998 년 공식 출시 6 월에 와서 재 작성 생산, PHP의 코어를 젠드 엔진을 1999 년에 [20] 그들은 또한 설립 젠드 기술 의 라 마트 간 , 이스라엘. [5]
2000 년 5 월 22 일 Zend Engine 1.0에 의해 구동되는 PHP 4가 릴리스되었습니다. [5] 2008 년 8 월 현재이 지점은 버전 4.4.9에 도달했습니다. PHP 4는 더 이상 개발 중이 아니며 보안 업데이트가 릴리스되지 않습니다. [21] [22]
PHP 5
2004 년 7 월 13 일, 새로운 Zend Engine II가 제공하는 PHP 5가 릴리스되었습니다. [5] PHP 5는 향상된 지원과 같은 새로운 기능을 포함 객체 지향 프로그래밍 (데이터베이스에 액세스하기위한 경량의 일관된 인터페이스를 정의)에 PHP 데이터 객체 (PDO) 확장 및 다양한 성능 향상. [23] 2008 년 PHP 5가 개발중인 유일한 안정 버전이되었습니다. PHP에서 후기 정적 바인딩 이 누락되어 버전 5.3에 추가되었습니다. [24] [25]
많은 오픈 소스 프로젝트에 때문에 GoPHP5 이니셔티브의 월 (5), 2008 년 새로운 코드에서 PHP 4를 지원하기 위해 정지, [26] PHP 5로 PHP 4의 전환을 촉진 PHP 개발자의 컨소시엄에 의해 제공 [ 27] [28]
시간이 지남에 따라 PHP 인터프리터는 PHP 소스 코드에서 빌드하거나 미리 빌드 된 바이너리를 사용하여 대부분의 기존 32 비트 및 64 비트 운영 체제에서 사용할 수있게되었습니다. [29] 는 PHP 버전 5.3 및 5.4의 경우, 사용할 수있는 유일한 마이크로 소프트 윈도우 바이너리 배포판했다 32 비트 의 x86이 빌드 [30] [31] 사용하는 동안 Windows 32 비트 호환 모드를 요구하는 인터넷 정보 서비스 64-에 (IIS)를 bit Windows 플랫폼. PHP 버전 5.5는 Microsoft Windows 에서 64 비트 x86-64 빌드를 사용할 수있게했습니다. [32]
PHP 6 및 유니 코드
PHP는 핵심 언어 수준의 유니 코드 지원 이 부족 하여 바이트 문자열 만 지원 하기 때문에 비판을 받았습니다 . 2005 년 Andrei Zmievski가 이끄는 프로젝트는 ICU ( International Components for Unicode ) 라이브러리를 내장하고 텍스트 문자열을 UTF-16으로 내부적 으로 표현 함으로써 PHP 전체에 유니 코드 지원을 제공하기 시작했습니다 . [33] 이 사용자 코드 언어의 내부와에 모두 큰 변화를 일으킬 것입니다 때문에, 다음 개발에 주요 기능과 함께 언어의 버전 6.0로이를 출시 할 계획되었다. [34]
그러나 웹 컨텍스트에서 거의 사용되지 않는 UTF-16과의 변환으로 인해 필요한 변경 사항과 성능 문제를 이해하는 개발자 부족으로 인해 프로젝트가 지연되었습니다. [35] 결과적으로, PHP 5.3 릴리즈가 2009 년에 만들어졌으며 많은 비 유니 코드 기능이 PHP 6, 특히 네임 스페이스에서 백 포트되었습니다. 2010 년 3 월에는 현재의 형태로 진행된 프로젝트가 공식적으로 포기되었으며, PHP 5.4의 특징 중 PHP 6의 나머지 유니 코드가 아닌 기능 (예 : 형질 및 클로저 재 바인딩)이 포함되어 준비되었습니다. [36] 초기 희망은 새로운 계획이 유니 코드 통합을 위해 형성 될 것이지만, 2014 년까지 채택 된 계획은 없었습니다.
PHP 7
2014 년과 2015 년 동안 새로운 주요 PHP 버전이 개발되었으며 PHP 7로 번호가 매겨졌습니다.이 버전의 번호 매기기에는 몇 가지 논쟁이있었습니다. [37] PHP 6 유니 코드 실험은 한번도 공개되지 않았지만 몇 가지 기사와 서적 제목이 PHP 6 이름을 참조했습니다. 새 릴리스에서 이름을 다시 사용하게되면 혼란을 야기 할 수 있습니다. [38] 투표 후에 PHP 7이라는 이름이 선택되었습니다. [39]
PHP 7의 기초 는 원래 PHP 차세대 ( phpng ) 라고 불리는 PHP 지사 입니다 . Dmitry Stogov, Xinchen Hui 및 Nikita Popov [40] 가 작성했으며 Zend Engine을 리팩터링하여 PHP 성능을 최적화하여 거의 완벽한 언어 호환성을 유지하면서 캐시 지역 이 개선 된 보다 소형 데이터 구조 를 사용하도록했습니다 . [41] 2014 년 7 월 14로서 , 워드phpng 프로젝트의 주요 벤치 마크 슈트였던 기반 벤치 마크는 거의 100 % 성능 향상을 보였습니다. phpng의 변경 사항은 JIT (Just -In- Time) 컴파일러 로의 성공적인 마이그레이션에 더 적합한보다 소형 데이터 구조 및 기타 변경 사항이 나타나기 때문에 향후 성능을 향상시키는 것이 더 쉬워 질 것으로 예상됩니다 . [42] 중대한 변화 때문에 재 작업 된 Zend Engine은 PHP 5에서 사용 된 Zend Engine 2를 이어 받은 Zend Engine 3 이라고합니다 .
phpng의 내부적 인 주요 변경으로 인해, PHP의 릴리스 프로세스에 따르면, PHP 5의 마이너 버전 보다는 새로운 주요 버전 의 PHP를 받아야합니다 . [44] PHP의 메이저 버전의 넓은 사용을 포함하는 후방 호환성을 바꿈 필요 phpng 이후 다른 개선의 기회를 제공 PHP 7 때문에 코드의 역방향 호환성을 나눌 수있는 예외를 , [45] [46] 변수 구문을 재가공 보다 일관되고 완벽 해지며, [47] 다양한 레거시 기능의 사용이 중단되거나 제거됩니다. [48] [49]
PHP 7도 기능에 대한 반환 유형 선언을 포함하여, 새로운 언어 기능을 도입, [50] 매개 변수의 스칼라 유형 (정수, 부동 소수점, 문자열 및 부울)에 대한 기존 매개 변수 유형 선언 및 지원을 보완하고 유형 선언을 반환한다. [51]
출시 이력
키색깔 | 의미 | 개발 |
---|
빨간 | 이전 버전 | 개발 없음 |
노랑 | 안정적 출시 | 보안 수정 |
녹색 | 안정적 출시 | 버그 및 보안 픽스 |
푸른 | 미래 출시 | 새로운 기능 |
번역 | 출시일 | ~까지 지원 [52] | 노트 |
---|
1.0 | 1995 년 6 월 8 일 | | 공식적으로 "개인 홈 페이지 도구 (PHP 도구)"라고합니다. 이것은 "PHP"라는 이름의 첫 번째 사용입니다. [5] |
2.0 | 1997 년 11 월 1 일 | | 공식적으로 "PHP / FI 2.0"이라고합니다. 이것은 실제로 PHP로 특성화 될 수있는 첫 번째 릴리스이며, 현재까지 견디는 많은 기능을 갖춘 독립형 언어입니다. |
3.0 | 1998 년 6 월 6 일 | 2000 년 10 월 20 일 [52] | 개발은 한 사람에서 여러 개발자로 이동합니다. Zeev Suraski와 Andi Gutmans가이 버전의 기본을 다시 작성합니다. [5] |
4.0 | 2000 년 5 월 22 일 | 2001 년 6 월 23 일 [52] | Zend 엔진이라고하는 고급 2 단계 구문 분석 / 실행 태그 구문 분석 시스템이 추가되었습니다. [53] |
4.1 | 2001 년 12 월 10 일 | 2002 년 3 월 12 일 [52] | 도입 된 "슈퍼 전역"( $_GET , $_POST , $_SESSION 등) [53] |
4.2 | 2002 년 4 월 22 일 | 2002 년 9 월 6 일 [52] | register_globals 기본적으로 비활성화 되어 있습니다. 네트워크를 통해받은 데이터는 더 이상 전역 네임 스페이스에 직접 삽입되지 않으므로 응용 프로그램의 보안 허점을 막을 수 있습니다. [53] |
4.3 | 2002 년 12 월 27 일 | 2005 년 3 월 31 일 [52] | CGI를 보완하기 위해 CLI (Command -Line Interface)를 도입했습니다 . [53 ] |
4.4 | 2005 년 7 월 11 일 | 2008 년 8 월 7 일 [52] | PHP 버전 4.3.x에 대해 컴파일 된 확장 기능과의 이진 호환성을 깨뜨리는 메모리 손상 버그가 수정되었습니다. [55] |
5.0 | 2004 년 7 월 13 일 | 2005 년 9 월 5 일 [52] | Zend Engine II에 새로운 객체 모델이 추가되었습니다. [56] |
5.1 | 2005 년 11 월 24 일 | 2006 년 8 월 24 일 [52] | 재 설계된 PHP 엔진에서 컴파일러 변수를 도입하여 성능이 향상되었습니다. [56] PHP 데이터 객체 (PDO)를 데이터베이스에 액세스하기위한 일관된 인터페이스로 추가했습니다. [57] |
5.2 | 2006 년 11 월 2 일 | 2011 년 1 월 6 일 [52] | 기본적으로 필터 확장을 사용합니다. 기본 JSON 지원. [56] |
5.3 | 2009 년 6 월 30 일 | 2014 년 8 월 14 일 [52] | 네임 스페이스 지원; 늦게 정적 바인딩 , 라벨 (제한 점프 고토 ), 폐쇄 , PHP 아카이브 (의 Phar) , 가비지 컬렉션을 순환 참조에 대한 개선 윈도우 작업 확장을위한 기본 라이브러리로 libmysql을 대체 등의 지원, sqlite3를, mysqlnd MySQL을 로에서는 FileInfo를, 향상된 MIME 지원, 국제화 확장 및 ereg 확장의 사용 중단을 위해 mime_magic을 대체했습니다 . |
5.4 | 2012 년 3 월 1 일 | 2015 년 9 월 3 일 [52] | 특성 지원, 짧은 배열 구문 지원. 삭제 된 항목 : register_globals , safe_mode , allow_call_time_pass_reference , , 와 . 내장 웹 서버. [58] 기존 기능, 성능 및 메모리 요구 사항 감소에 대한 몇 가지 개선 사항.session_register() session_unregister() session_is_registered() |
5.5 | 2013 년 6 월 20 일 | 2016 년 7 월 21 일 [52] | 예외 처리를 위한 생성기 , finally 블록, 공식 배포판에 번들 된 OpCache (Zend Optimizer + 기반) 지원. [59] |
5.6 | 2014 년 8 월 28 일 | 2018 년 12 월 31 일 [60] | 상수 스칼라 표현식, variadic 함수 , 인수 unpacking, 새로운 지수 연산자, 함수 및 상수에 대한 use 문의 확장 , SAPI 모듈로서의 새로운 phpdbg 디버거 및 기타 작은 개선. [61] |
6.x | 공개되지 않음 | N / A | 네이티브 유니 코드 지원을 포함 할 예정인 버려진 PHP 버전. [62 ] |
7.0 | 2015 년 12 월 3 일 [2] | 2018 년 12 월 3 일 [60] | 젠드 엔진 3 (성능 향상 [42] 및 Windows 64 비트 정수 지원 [64] ), 균일 변수 구문 [47] AST 기반 편집 방법은, [65]를 첨가하여 , [66] 비트 플랫폼 일관성 시프트 [ 67] ( null coalesce ) 연산자, [68] 유니 코드 코드 포인트 이스케이프 시퀀스 , 69 반환 유형 선언, 50 스칼라 유형 (정수, 부동, 문자열 및 부울) 선언, [51] "우주선" 3 방향 비교 연산자 , [70] 발전기Closure::call() ?? <=> 대표단 [71] 익명 클래스 , [72] 간단하고 지속적으로 사용할 수 CSPRNG의 API, [73] 더 현대적인 많은 나머지 내부 PHP "오류"대체 예외 , [45] 네임 스페이스에서 여러 항목을 가져 오기 및 약식 구문 . [74] |
7.1 | 2016 년 12 월 1 일 [75] [76] | 2019 년 12 월 1 일 [60] | 무효 반환 유형 , [77] 클래스 상수 가시성 수정 자 , [78] Nullable 유형 , [79] iterable 의사 유형, [80] 여러 예외 유형 catch. [81] |
7.2 | 2017 년 11 월 30 일 [82] | 2020 년 11 월 30 일 [60] | |
2011 년 6 월 28 일부터 PHP 그룹은 PHP의 새 버전 출시 일정을 수립했습니다. [44] 이 시스템 하에서 매달 최소한 하나의 석방이 이루어져야한다. 1 년에 한 번, 새로운 기능이 포함될 수있는 사소한 릴리스가 발생해야합니다. 모든 마이너 릴리스는 최소한 보안 및 버그 수정을 포함하여 2 년 동안 지원되어야하며, 적어도 1 년의 보안 수정만으로 모든 마이너 릴리스에 대해 총 3 년의 릴리스 프로세스가 이루어져야합니다. 작고 독립적 인 기능을 제외하고는 새로운 기능을 3 년 동안 출시 할 때 사소한 내용으로 소개하지 않습니다.
구문
다음 "Hello, World!" 프로그램 은 HTML 문서에 삽입 된 PHP 코드로 작성됩니다 .
<! DOCTYPE HTML>
< HTML >
< 머리 >
< 제목 > PHP 테스트 </ 제목 >
</ 머리 >
< 몸 >
<? PHP는 에코 '<p> 안녕하세요 </ P>' ; ?> </ body > </ html >
그러나 PHP 코드가 HTML에 포함될 필요가 없으므로 Hello, World! 의 가장 간단한 버전입니다 . 순수한 PHP 코드 [85]가 들어있는 파일에서 닫는 태그를 생략 한 상태에서 이와 같이 작성할 수 있습니다 .
PHP 인터프리터는 구분 기호 내에서만 PHP 코드를 실행 합니다. PHP 코드 가 아닌 텍스트는 여전히 PHP 코드에서 설명 하는 제어 구조의 대상이되지만 구분 기호를 벗어난 항목은 PHP에서 처리하지 않습니다 . 가장 일반적인 구분 기호는 <? php open and ?> PHP 섹션을 닫는 것입니다. 단축 된 형식 <? 또한 존재합니다. 이 짧은 구분자 (delimiter)는 스크립트 파일을 로컬 PHP 구성에서 비활성화 할 수 있으므로 스크립트 파일의 이식성을 떨어 뜨리기 때문에 사용하지 않는 것이 좋습니다. [86] [87] 그러나, 에코 짧은 태그 <? = 의 사용에 대한 추천은 없습니다 . [5.4] PHP 5.4.0 이전 버전에서는echo () 는 short_open_tag 구성 설정을 사용 하는 경우에만 작동하며 PHP 5.4.0 이상에서는 항상 사용할 수 있습니다. [86] [89] [90] 모든 분리의 목적은 비 PHP 콘텐츠로부터 PHP 코드 분리하는 자바 스크립트 코드 또는 HTML 마크 업. [91]
XHTML 및 기타 XML 문서 에서 구분 기호의 첫 번째 형식 인 <? php 및 ?> 은 올바르게 구성된 XML 처리 명령을 작성합니다. [92] 이것은 결과적으로 PHP 코드와 서버 측 파일에있는 다른 마크 업의 혼합이 그 자체로 잘 구성된 XML임을 의미합니다.
변수는 앞에 붙 달러 기호 및 유형은 사전에 지정할 필요가 없습니다. PHP 5 에서는 함수가 매개 변수를 특정 클래스, 배열, 인터페이스 또는 콜백 함수의 객체로 만들 수있는 유형 힌팅 을 도입했습니다 . 그러나 PHP 7.0 이전에는 정수 또는 문자열과 같은 스칼라 유형과 함께 유형 힌트를 사용할 수 없었습니다. [51]
함수 및 클래스 이름과 달리 변수 이름은 대소 문자를 구분합니다. 큰 따옴표 ( "")와 heredoc 문자열은 변수의 값을 문자열에 보간하는 기능을 제공합니다. [93] PHP가 취급 개행 으로 공백 (A)의 방법으로 자유 형식 언어 및 문장들은 세미콜론으로 종료된다. [94] PHP에는 세 가지 유형의 주석 구문이 있습니다 : /* */마크 블록과 인라인 주석; //뿐만 아니라 #한 줄 주석으로 사용됩니다. [95]echo 문은 PHP가 출력 텍스트로 제공하는 여러 시설 중 하나입니다 예를 들어, 웹 브라우저,.
키워드와 언어 구문의 관점에서 PHP는 C 스타일 구문과 유사합니다. 경우 조건 에 대한 그리고 동안 루프, 함수 반환은 C, C ++, C #을, Java 및 Perl과 같은 언어에 대한 구문과 유사하다.
다음은 PHP for 루프의 예입니다.
<? php
for ( $ x = 0 ; $ x <= 100 ; $ x ++ ) {
echo "숫자는 $ x <br>" ;
}
?>
데이터 유형
PHP는 정수를 C 언어 long 타입 과 동일한 64 비트 또는 32 비트 부호있는 정수 로 플랫폼 종속 범위에 저장 합니다 . 특정 상황에서는 부호없는 정수가 부호있는 값으로 변환됩니다. 이 동작은 다른 프로그래밍 언어의 동작과 다릅니다. [96] 정수 변수는 10 진수 (양수 및 음수), 8 진수 , 16 진수 및 2 진수 표기법을 사용하여 할당 할 수 있습니다 .
부동 소수점 숫자는 플랫폼 별 범위에도 저장됩니다. 부동 소수점 표기법이나 두 가지 형식의 과학 표기법을 사용하여 지정할 수 있습니다 . [97] PHP 네이티브 갖는 부울 네이티브 부울 타입과 유사한 유형 자바 및 C ++를 . 부울 유형 변환 규칙을 사용하면 Perl 및 C ++ 에서 와 같이 0이 아닌 값은 true로 해석되고 0은 false로 해석됩니다 . [97]
null 데이터 유형은 값이없는 변수를 나타냅니다. NULL이 데이터 형식에 대해 유일하게 허용되는 값입니다. [97]
"자원"유형의 변수는 외부 소스의 자원에 대한 참조를 나타냅니다. 이들은 일반적으로 특정 확장 기능의 함수에 의해 생성되며 동일한 확장자의 함수로만 처리 할 수 있습니다. 예에는 파일, 이미지 및 데이터베이스 자원이 포함됩니다. [97]
배열은 PHP가 처리 할 수있는 모든 유형의 요소 (예 : 자원, 객체 및 기타 배열)를 포함 할 수 있습니다. 순서는 값 목록과 키와 값 모두가 있는 해시에 보존되며 두 항목은 혼합 될 수 있습니다. [97] PHP도 지원 문자열 따옴표 따옴표, nowdoc 또는 함께 사용할 수 히어 닥 구. [98]
표준 PHP 라이브러리 (SPL)는 표준 문제를 해결하려고 시도하고 효율적인 데이터 액세스 인터페이스와 클래스를 구현합니다. [99]
함수
PHP는 핵심 언어로 많은 함수를 정의하고 있으며 많은 함수가 다양한 확장 기능으로 제공됩니다. 이 함수들은 온라인 PHP 문서에 잘 설명되어 있습니다. [100] 에서 설명하지만, 내장 된 라이브러리는, 명명 규칙과 연관된 불일치 다양한 갖는다 이력 상술.
사용자 정의 함수는 개발자가 정의 할 수 있습니다 (예 :
function myAge ( $ birthYear ) { // 함수를 정의합니다.이 이름은 "myAge"입니다.
$ yearsOld = date ( 'Y' ) - $ birthYear ; // 연령
반환 $ yearsOld를 계산합니다 . '년' . ( $ yearsOld ! = 1 ? '' : '' ); // 설명적인 형식으로 나이를 반환합니다.
}
에코 '나는 현재' 입니다. myAge ( 1981 ) . ' 늙은.' ; //
myAge ()의 반환 값으로
연결된 텍스트를 // 출력합니다. // 이 구문의 결과로 myAge ()가 호출됩니다.
2017 년에 위의 샘플 프로그램의 결과물은 '저는 현재 36 세입니다.'
함수 포인터 대신 PHP의 함수는 이름이 들어있는 문자열로 참조 할 수 있습니다. 이런 식으로 일반적인 PHP 함수를 콜백 이나 함수 테이블 과 같이 사용할 수 있습니다 . [101] 사용자 정의 함수는 프로토 타이핑을 하지 않고 언제든지 만들 수 있습니다 . [100] [101] 함수는 허가 코드 블록 내에 정의 할 수 런타임 결정 함수가 정의되어야하는지 여부에있다. 가 function_exists소정의 이름을 가진 함수는 이미 정의되어 있는지 여부를 판단 기능. 함수 호출은 인자가없는 클래스 생성자를 제외하고 괄호를 사용해야합니다.PHP 연산자 new로 호출되는 함수 .이 경우 괄호는 선택 사항입니다.
PHP 5.3까지 익명 함수 및 클로저에 대한 지원 은 PHP에 존재하지 않았습니다. create_function()PHP 4.0.1부터 존재 하지만 , eval()프로그램 실행 중에 일반적인 PHP 함수를 만들 수 있는 단순한 랩퍼 일뿐 입니다. [102] PHP 5.3 익명 함수 또는 "폐쇄"를 정의하는 신택스를 추가 [103] 주변 영역의 변수를 캡처 할 수 :
함수 getAdder ( $ x ) {
return 함수 ( $ y ) 사용 ( $ x ) {
return $ x + $ y ;
};
}
$ adder = getAdder ( 8 );
echo $ adder ( 2 ); // "10"을 인쇄합니다.
위의 예제에서 getAdder()함수는 전달 된 인수 $x(키워드 use가 어휘 컨텍스트에서 변수를 가져옴) $y를 사용하여 클로저를 작성합니다.이 인수는 추가 인수 를 사용하여 작성된 클로저를 호출자에게 리턴합니다. 이러한 함수는 first-class 객체로서, 변수에 저장되거나 다른 함수에 매개 변수로 전달 될 수 있습니다 .
동적으로 타입이 지정되는 언어의 경우, PHP는 런타임에 적용되는 함수 매개 변수에 대한 유형 선언을 지원합니다. 이것은 PHP 5.0 이후부터, PHP 5.4 이후의 "callables" , PHP 7.0 이후의 스칼라 (정수, 부동, 문자열 및 부울) 유형에 대한 PHP 5.1 이후의 클래스 및 인터페이스에 대해 지원되었습니다 . [51] PHP 7.0은 또한 매개 변수 목록 다음에 콜론이 오는 유형 이름을 삽입하여 표현 된 함수 리턴 유형에 대한 유형 선언을 가지고 있습니다. [50] 예를 들어, getAdder이전의 예에서 함수이므로 PHP 7과 같은 종류로 주석 될 수있다 :
함수 getAdder ( int $ x ) : \ Closure {
return function ( int $ y ) use ( $ x ) : int {
return $ x + $ y ;
};
}
$ adder = getAdder ( 8 );
echo $ adder ( 2 ); // "10"을
출력합니다. echo $ adder ( null ); 잘못된 유형이 전달 되었기 때문에 예외를 throw합니다.
$ adder = getAdder ([]); // 또한 예외를 throw합니다.
기본적으로 스칼라 유형 선언은 약한 타이핑 원칙을 따릅니다. 예를 들어, 매개 변수의 유형이 intPHP 인 경우 정수뿐만 아니라 변환 가능한 숫자 문자열, 부동 소수점 또는 부울을 해당 함수에 전달할 수 있으며 변환 할 수 있습니다. [51] 그러나 PHP 7은 "strict typing"모드를 사용합니다.이 모드는 함수 호출시 이러한 변환을 허용하지 않고 파일 내에서 반환합니다. [51]
객체 지향 프로그래밍
기본 객체 지향 프로그래밍 기능은 PHP 3에서 추가되었으며 PHP 4에서 향상되었습니다. [5] 이것은 PHP가 언어를 사용하는 프로그래머가 창의적인 작업을 쉽게 수행 할 수 있도록 더 많은 추상화를 가능하게합니다. PHP 5에서는 객체 처리가 완전히 다시 작성되어 기능 집합이 확장되고 성능이 향상되었습니다. [105] PHP 이전 버전은 오브젝트가 같이 처리 한 치형 . [105] 이 방법의 단점은 코드가 PHP의 복사본을 만드는 것이 아니라 전달 된 객체를 수정하려는 경우 PHP의 "참조"변수를 많이 사용해야한다는 것입니다. 새로운 접근법에서 객체는 값이 아닌 핸들 에 의해 참조됩니다 .
PHP 5는 추상 클래스 , 최종 클래스 , 추상 메소드 및 최종 메소드 와 함께 private 및 protected 멤버 변수 및 메소드를 도입했습니다 . 또한 C ++ 와 같은 다른 객체 지향 언어 및 표준 예외 처리 모델 과 유사한 생성자 및 소멸자 를 선언하는 표준 방법을 소개했습니다 . 또한 PHP 5는 인터페이스를 추가 하고 여러 인터페이스를 구현할 수있었습니다. 객체가 런타임 시스템과 상호 작용할 수있게 해주는 특별한 인터페이스가 있습니다. ArrayAccess를 구현하는 객체 는 다음과 함께 사용할 수 있습니다.Iterator 또는 IteratorAggregate를 구현하는 배열 구문 및 객체를 foreach 언어 구문 과 함께 사용할 수 있습니다 . 아무 없다 가상 테이블 엔진의 특징은, 그래서 정적 변수는 이름 대신 컴파일시에 참조 바인딩됩니다. [106]
개발자가 예약어를 사용하여 객체의 사본을 생성 clone하면 Zend 엔진은 __clone()메소드가 정의 되었는지 여부를 확인합니다 . 그렇지 않은 경우 __clone()객체의 속성을 복사 하는 기본값 을 호출 합니다. __clone()메소드가 정의 된 경우 , 작성된 오브젝트에서 필요한 특성을 설정하는 책임이 있습니다. 편의상 엔진은 소스 객체의 속성을 가져 오는 함수를 제공하므로 프로그래머는 원본 객체의 값순 복제본 으로 시작하고 변경할 필요가있는 속성 만 재정의 할 수 있습니다. [107]
다음은 PHP에서 의 객체 지향 프로그래밍 의 기본 예제입니다 .
class Person
{
public $ firstName ;
public $ lastName ;
공용 함수 __construct ( $ firstName , $ lastName = '' ) { // 선택적인 두 번째 인수
$ this -> firstName = $ firstName ;
$ this- > lastName = $ lastName ;
}
public function greet () {
return '안녕하세요, 제 이름은' 입니다. $ this -> firstName .
(( $ this- > lastName ! = '' ) ? ( '' . $ this- > lastName ) : '' ) . '.' ;
}
public static function staticGreet ( $ firstName , $ lastName ) {
return '안녕하세요, 제 이름은' 입니다. $ firstName . '' . $ lastName . '.' ;
}
}
$ he = 새로운 사람 ( 'John' , 'Smith' );
$ she = new Person ( '샐리' , '데이비스' );
$ other = new Person ( 'iAmine' );
echo $ he -> greet (); // "여보세요, 제 이름은 존 스미스입니다."
echo '<br />' ;
echo $ she -> greet (); // "여보세요, 제 이름은 샐리 데이비스입니다."
echo '<br />' ;
echo $ other -> greet (); // "Hello, my name is iAmine"을 출력합니다.
echo '<br />' ;
echo Person :: staticGreet ( 'Jane' , 'Doe' ); // "여보세요, 제 이름은 Jane Doe입니다."
가시성 PHP의 속성 및 메서드는 사용하여 정의 키워드를 public , private하고 protected. var 만 사용되는 경우 기본값은 public 입니다. var에 대한 동의어입니다 public. 선언 된 항목은 public어디에서나 액세스 할 수 있습니다. 상속 된 클래스 (및 항목을 정의하는 클래스)에 protected대한 액세스를 제한합니다 . 항목을 정의하는 클래스에만 가시성을 제한합니다. [108] 동일한 유형의 객체가 같은 인스턴스가 아닌 경우에도 서로의 개인 보호 멤버에 액세스 할 수 있습니다. PHP의 멤버 가시성 기능은 "매우 유용합니다."라고 때때로 기술되었습니다. [109]private그러나 때로는 "부적절하고 최악의 경우에는 긍정적 인 해로움"이라고 묘사되기도합니다. [110]
구현
독창적이고 완벽하고 광범위하게 사용되는 PHP 구현은 젠드 엔진에 의해 구동되며 단순히 PHP로만 알려져 있습니다. 다른 구현체와의 모순을 없애기 위해 비공식적으로 "Zend PHP"라고합니다. Zend Engine은 PHP 소스 코드 를 실행 가능한 내부 형식으로 컴파일 하므로 인터프리터 로 작동합니다 . [111] [112] 이것은 PHP의 "레퍼런스 구현"이기도합니다. PHP는 정식 명세가 없기 때문에 젠드 PHP의 의미는 PHP 자체의 의미를 정의합니다. 젠드 (Zend)의 작동 방식에 의해 정의 된 PHP의 복잡하고 미묘한 의미론 때문에, 경쟁하는 구현체가 완전한 호환성을 제공하기가 어렵습니다.
PHP의 스크립트 당 단일 요청 실행 모델과 Zend Engine이 인터프리터라는 사실은 비효율적입니다. 결과적으로 PHP 성능을 향상시키는 데 도움이되는 다양한 제품이 개발되었습니다. 사용하여 PHP 소스 코드를 웹 페이지, PHP 스크립트는 또한 PHP 엔진의 내부 형식으로 배포 할 수 있습니다 액세스 할 때마다 컴파일해야 실행 시간을 단축하지하기 위해 연산 코드 에 의해 작동 캐시, 캐시 의 컴파일 된 양식을 스크립트가 실행될 때마다 코드 를 파싱 하고 컴파일 하는 오버 헤드를 피하기 위해 공유 메모리 에 있는 PHP 스크립트 (opcode) . Opcode 캐시 Zend Opcache 는 버전 5.5부터 PHP에 내장되어 있습니다. [113]널리 사용되는 opcode 캐시의 또 다른 예 는 PECL 확장으로 사용할 수 있는 대체 PHP 캐시 (APC) 입니다. [114]
Zend PHP가 여전히 가장 보편적 인 구현이지만 다른 여러 구현이 개발되었습니다. 이들 중 일부는 컴파일러 이거나 JIT 컴파일을 지원 하므로 완전한 PHP 호환성이 없더라도 Zend PHP보다 성능 이점을 제공합니다. 대체 구현에는 다음이 포함됩니다.
힙합 가상 머신 (HHVM) - 페이스 북에서 개발되고 오픈 소스로 사용 가능하며, PHP 코드를 상위 바이트 코드 (일반적으로 중간 언어로 알려져 있음 )로 변환 한 다음 런타임시 동적으로 x86-64 기계 코드로 변환합니다. JIT ( just-in-time ) 컴파일러를 사용하여 최대 6 배의 성능 개선 효과를 얻을 수 있습니다. [115]
Parrot - 동적 언어를 효율적으로 실행하도록 설계된 가상 시스템입니다. Pipp은 PHP 소스 코드를 Parrot 중간 표현으로 변환 한 다음 Parrot의 바이트 코드로 변환하고 가상 시스템에서 실행합니다.
Phalanger - PHP를 CIL ( Common Intermediate Language ) 바이트 코드로 컴파일
HipHop - Facebook에서 개발되고 오픈 소스로 사용 가능하며, PHP 스크립트를 C ++ 코드 로 변환 한 다음 결과 코드를 컴파일하여 서버로드를 최대 50 %까지 줄입니다. 2013 년 초, Facebook은 배포의 어려움과 create_function () 및 eval () 구문을 비롯한 전체 PHP 언어에 대한 지원 부족을 비롯하여 여러 가지 이유로 인해 HHVM을 선호했습니다 . [116]
라이센스
PHP는 다음과 같은 PHP 라이센스에 따라 배포되는 자유 소프트웨어 입니다. [117]
이 소프트웨어에서 파생 된 제품은 group@php.net의 사전 서면 승인 없이는 "PHP"라고 할 수 없으며 이름에 "PHP"를 사용할 수 없습니다. 귀하의 소프트웨어가 "PHP Foo"또는 "phpfoo"가 아닌 " Foo for PHP" 라고 말하면 PHP와 연계하여 작동 함을 나타낼 수 있습니다 .
"PHP"사용에 대한이 제한은 PHP 라이센스를 GPL ( General Public License) 과 호환하지 못하게 만드는 반면, 젠드 라이센스는 원본 BSD 라이센스 와 유사한 광고 조항으로 인해 호환되지 않습니다 . [118]
개발과 커뮤니티
PHP는 소스 배포판에 다양한 무료 및 오픈 소스 라이브러리 를 포함하거나 PHP 바이너리 빌드 결과로 사용합니다. PHP는 근본적으로 FTP ( File Transfer Protocol ) 서버와 PostgreSQL , MySQL , Microsoft SQL Server 및 SQLite (임베디드 데이터베이스), LDAP 서버 등을 비롯한 많은 데이터베이스 서버 에 액세스하기위한 모듈이 내장 된 인터넷 기반 시스템입니다. . stdio 계열 과 같은 C 프로그래머에게 익숙한 수많은 함수 는 표준 PHP 빌드에서 사용할 수 있습니다. [119]
PHP는 개발자가 쓸 수있는 확장 에서 C를 PHP 언어에 기능을 추가 할 수 있습니다. PHP 확장은 PHP로 정적으로 컴파일되거나 런타임에 동적으로로드 될 수 있습니다. Windows API , Unix 계열 운영 체제의 프로세스 관리 , 멀티 바이트 문자열 ( Unicode ), cURL 및 여러 가지 널리 사용되는 압축 형식에 대한 지원을 추가하기 위해 수많은 확장이 작성되었습니다 . 확장을 통해 제공되는 다른 PHP 기능으로는 IRC 와의 통합 , 이미지 및 Adobe Flash 컨텐츠 의 동적 생성 , PHP Data Objects데이터베이스에 액세스하기 위해 사용되는 추상 계층 (PDO), [120] [121] [122] [123] [124] [125] [126] , 심지어 음성 합성 . 문자열과 배열을 다루는 것과 같은 언어의 핵심 기능 중 일부는 확장 기능으로도 구현됩니다. [127] PHP 확장 커뮤니티 도서관 (PECL) 프로젝트는 PHP 언어의 확장을위한 저장소입니다. [128]
제퍼 (Zephir )와 같은 일부 프로젝트 는 PHP 확장을 고급 언어로 작성하고 기본 PHP 확장으로 컴파일 할 수있는 기능을 제공합니다. C에서 PHP 확장을 직접 작성하는 대신 이러한 접근 방식은 확장 개발을 단순화하고 프로그래밍 및 테스트에 필요한 시간을 단축합니다. [129]
PHP의 그룹 (2015 십명 구성 :) 티에스 C 안츤 , 스티그 바켄 , 셰인 카라베오 , 앤디 굿먼스 , 라스무스 러 도프 , 샘 루비 , 사스카 슈만 , 지브 수라스키 , 짐 윈스테드 , 안드레이 즈미에비스키 . [130]
Zend Technologies 는 프로그래머가 공인 PHP 개발자가 될 수 있도록 PHP 5.5 [131] 시험을 기반으로 PHP 인증을 제공합니다 .
설치 및 구성
PHP에 대한 지원을 웹 서버에 추가하는 데는 네이티브 웹 서버 모듈 또는 CGI 실행 파일의 두 가지 주요 방법이 있습니다. PHP에는 Apache HTTP Server , Microsoft IIS , Netscape (현재 제공되지 않음) 및 iPlanet을 포함한 많은 웹 서버에서 지원되는 SAPI ( Server Application Programming Interface) 라는 직접 모듈 인터페이스 가 있습니다. OmniHTTPd와 같은 일부 다른 웹 서버 는 Microsoft 의 웹 서버 모듈 인터페이스 인 ISAPI ( Internet Server Application Programming Interface)를 지원합니다 . PHP에 웹 서버에 대한 모듈 지원이 없다면, CGI ( Common Gateway Interface ) 또는 FastCGI프로세서; 이 경우 웹 서버는 PHP의 CGI 실행 파일을 사용하여 PHP 파일에 대한 모든 요청을 처리하도록 구성됩니다. [132]
PHP-FPM (FastCGI 프로세스 관리자)은 5.3.3 버전 이후 공식 PHP 배포판에 번들로 제공되는 PHP 용 대안 FastCGI 구현입니다. [133] 이전 FastCGI 구현과 비교할 때, 여기에는 몇 가지 추가 기능이 포함되어 있으며 대부분로드가 많은 웹 서버에 유용합니다. [134]
명령 줄 스크립팅을 위해 PHP를 사용하는 경우 PHP 명령 줄 인터페이스 (CLI) 실행 파일이 필요합니다. PHP는 PHP 4.3.0부터 CLI SAPI를 지원합니다. [135] 이 SAPI의 주요 초점은 PHP를 사용하여 셸 응용 프로그램을 개발 하는 것입니다. CLI SAPI와 다른 SAPI 간에는 많은 차이점이 있지만 동일한 동작을 많이 공유합니다. [136]
PHP는 다른 웹 서버에 SAPI라는 직접 모듈 인터페이스를 가지고 있습니다. [137] 윈도우에 PHP 5 아파치 2.0의 경우에는,이 (A)의 형태로 제공되어 DLL을 호출 파일 php5apache2.dll , [138] , 다른 기능 중에서, PHP와 웹 서버 사이의 인터페이스를 제공하는 모듈이다 서버가 이해할 수있는 형태로 구현됩니다. 이 양식은 SAPI로 알려져 있습니다.
다양한 웹 서버 확장을위한 다양한 종류의 SAPI가 있습니다. 예를 들어 위에 나열된 것 외에도 PHP 언어에 대한 기타 SAPI에는 CGI ( Common Gateway Interface ) 및 CLI (Command -Line Interface )가 포함됩니다. [ 139]
PHP는 또한 PHP-GTK 확장 을 사용하여 데스크탑 그래픽 사용자 인터페이스 (GUI) 응용 프로그램 을 작성하는 데 사용할 수 있습니다 . PHP-GTK는 공식 PHP 배포판에 포함되어 있지 않으며 [132] , 확장 버전으로 PHP 버전 5.1.0 이상에서만 사용할 수 있습니다. PHP-GTK를 설치하는 가장 일반적인 방법은 소스 코드에서 컴파일하는 것입니다. [140]
PHP가 클라우드 환경 에 설치되고 사용될 때 클라우드 관련 기능을 사용하기위한 소프트웨어 개발 키트 (SDK)가 제공됩니다. 예 :
Amazon Web Services 는 PHP 용 AWS SDK [141] 를 제공합니다 .
Windows Azure 는 Windows Azure SDK for PHP와 함께 사용할 수 있습니다. 또한,
수많은 PHP 구성 요소와 확장 기능에 영향을 미치는 수많은 구성 옵션이 지원됩니다. [144] [144]php.ini PHP가 사용되는 방식에 따라 설정 파일 이 다른 위치에서 검색됩니다. [145] 구성 파일이 여러 부분들로 분할된다 [146] 의 구성 옵션 중 일부는 웹 서버 구성에서 설정 될 수있다. [147]
사용
PHP는 서버 측 웹 개발에 특히 적합한 범용 스크립팅 언어입니다.이 경우 PHP는 일반적으로 웹 서버 에서 실행됩니다 . 요청 된 파일의 모든 PHP 코드 는 PHP 런타임에 의해 실행 되며 일반적으로 웹 사이트 또는 다른 곳에서 사용되는 동적 웹 페이지 컨텐츠 또는 동적 이미지 를 작성 합니다. [148] 또한 명령 행 스크립팅 및 클라이언트 측 그래픽 사용자 인터페이스 (GUI) 응용 프로그램에도 사용할 수 있습니다. PHP는 대부분의 웹 서버, 많은 운영 체제 및 플랫폼 에 배포 할 수 있으며 많은 관계형 데이터베이스 관리 시스템 과 함께 사용할 수 있습니다(RDBMS). 대부분의 웹 호스팅 제공 업체는 고객이 PHP를 사용할 수 있도록 지원합니다. PHP 그룹은 무료로 사용할 수 있으며 PHP 그룹은 사용자가 자신 만의 용도로 빌드, 사용자 정의 및 확장 할 수있는 완전한 소스 코드를 제공합니다. [8]
동적 웹 페이지 : 서버 측 스크립팅 예제 (PHP 및 MySQL).
PHP가 주로 역할 필터 , [149] 파일 또는 스트림에 포함 된 텍스트 및 / 또는 PHP 지시 입력을 취하고 다른 데이터 스트림을 출력한다. JSON , XML 또는 이미지 또는 오디오 형식과 같은 이진 데이터 가 될 수 있지만 일반적으로 출력은 HTML 입니다. PHP 4 이후, PHP 파서는 입력을 컴파일 하여 젠드 엔진에 의한 처리 를 위해 바이트 코드 를 생성하여 이전 인터프리터에 비해 향상된 성능을 제공 합니다. [150]
원래 동적 생성하기위한 웹 페이지를 , PHP는 지금에 주로 초점을 맞추고 서버 측 스크립트 , [151] 그리고 그것은에 웹 서버에서 동적 콘텐츠를 제공하는 다른 서버 측 스크립트 언어와 유사하다 클라이언트 와 같은, 마이크로 소프트 의 클래식 ASP, 썬 마이크로 ' 자바 서버 페이지 , [152] 및 mod_perl이 . PHP는 많은 개발 끌고있다 소프트웨어 프레임 워크 빌딩 블록 및 홍보 할 수있는 설계 구조를 제공 신속한 응용 프로그램 개발 (RAD)를. 이들 중 일부는 PRADO , CakePHP, Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon 및 Zend Framework 등이 있으며 다른 웹 프레임 워크 와 비슷한 기능을 제공합니다 .
LAMP 아키텍처는 웹 응용 프로그램을 배포하는 방법으로 웹 업계에서 인기를 끌고있다. [153] PHP는 리눅스 , 아파치 및 MySQL 과 함께이 번들 에서 P 로 일반적으로 사용 되지만, P 는 파이썬 , 펄 또는 그 중 일부를 참조 할 수도 있습니다 . 비슷한 패키지 인 WAMP 와 MAMP 도 Windows 와 macOS에서 사용할 수 있습니다.첫 번째 문자는 해당 운영 체제를 나타냅니다. PHP와 Apache 모두 macOS 기본 설치의 일부로 제공되지만이 패키지를 사용하는 사용자는보다 쉽게 최신 설치를 유지할 수있는 간단한 설치 메커니즘을 찾습니다.
2007 년 4 월 현재 2 천만 개가 넘는 인터넷 도메인에 PHP가 설치된 서버에서 웹 서비스가 호스팅되고 mod_php 가 가장 많이 사용되는 Apache HTTP Server 모듈 로 기록되었습니다 . [154] 2017 년 5 월 현재 PHP는 가장 인기있는 1,000 만 개 웹 사이트의 83 %에서 서버 측 프로그래밍 언어로 사용되었습니다. [155] 웹 콘텐츠 관리 시스템 PHP 작성된 포함 위키 , [156] 줌라 , [157] 레즈 게시 , 레즈 플랫폼 , SilverStripe , [158] 워드 , [159] 드루팔 , [160]및 무들 . [161] 에서, PHP 작성된 웹 사이트 백 - 엔드 및 / 또는 사용자 실부는, 한국어 , [162] 디그 , [163] 텀블러 , [164] 데일리 모션 , [165] 및 여유를 . [166]
특정 및 고급 사용 시나리오를 위해 PHP는 C 또는 C ++ 에서 사용자 정의 확장을 작성하기위한 잘 정의되고 문서화 된 방법을 제공합니다 . [167] [168] [169] [170] [171] [172] [173] 의 추가의 형태 언어 자체를 확장 게다가 라이브러리 , 확장이 중요하며 실내가있는 곳에 실행 속도를 향상시키기위한 방법을 제공하는 진정한 컴파일 언어 를 사용하여 개선되었습니다 . [175] [175 ] [175] PHP는 또한 다른 소프트웨어 프로젝트에 자신을 포함시키기위한 잘 정의 된 방법을 제공합니다. 그렇게하면 PHP를 내부 스크립팅 언어 로 쉽게 사용할 수 있습니다.다른 프로젝트의 경우 프로젝트의 특정 내부 데이터 구조 와 긴밀한 인터페이스를 제공 합니다. [176]
PHP 는 "pthreads" PECL 확장을 통해 스레드를 사용할 수 있지만 핵심 언어 수준에서 멀티 스레딩 에 대한 지원이 부족하기 때문에 혼합 검토를 받았습니다 [177] . [178 ]
2013 년 1 월 현재 PHP는 2 억 4 천만 개 이상의 웹 사이트 (샘플링 된 웹 사이트 중 39 %) 에서 사용되고 210 만 개의 웹 서버 에 설치되었습니다 .
보안
2013 년에는 National Vulnerability Database에 나열된 모든 취약점 중 9 % 가 PHP와 연결되었습니다. [181] 역사적으로,이 데이터베이스의 1996 년 이후 나열된 모든 취약점의 약 30 %가 PHP에 연결된다. 언어 자체 또는 핵심 라이브러리의 기술적 보안 결함은 빈번하지 않습니다 (PHP는 나열된 프로그램의 약 20 %에 적용되지만 2009 년에는 22 건으로 전체의 약 1 %였습니다). [182] 프로그래머가 일부 언어에는 많은 문제를 유발하는 입력 유효성 검사 의 부족을 자동으로 감지하기위한 오염 검사 가 포함됩니다 . 이러한 기능은 PHP 용으로 개발되고 있습니다. [183]그러나 석방으로의 그것의 포함은 과거에 여러 번 거절되었다. [ 185]
Suhosin 및 Hardening -Patch 와 같은 고급 보호 패치가 있는데 , 이는 웹 호스팅 환경을 위해 특별히 고안되었습니다. [186] 주로 이러한 환경이 부주의하게 작성된 코드가 실행될 수있는 곳으로 간주되기 때문입니다.
PHP 응용 프로그램을 보안 문제로 만드는 특정 언어 기능과 구성 매개 변수 (주로 이러한 런타임 설정의 기본값)가 있습니다. 이 중 magic_quotes_gpc 및 register_globals [187] 구성 지시문이 가장 잘 알려져 있습니다. 후자는 URL 매개 변수를 PHP 변수로 만들어 공격자가 초기화되지 않은 전역 변수의 값을 설정하고 PHP 스크립트의 실행을 방해하도록하여 심각한 보안 취약성을위한 경로를 열었습니다. " magic quotes "및 "register globals"에 대한 지원은 PHP 5.3.0부터 사용되지 않으며 PHP 5.4.0부터 제거되었습니다. [188]
런타임 설정 취약점의 또 다른 예는 업로드 된 이미지가 저장된 디렉토리에 대해 PHP 실행을 비활성화하지 못하게하는 것 ( 엔진 구성 지시어 를 통해 ) [189] ; 기본 설정을 그대로두면 업로드 된 이미지에 악의적 인 PHP 코드가 포함될 수 있습니다. [190] [191] [192] 또한 공유 웹 호스팅 환경 에서 PHP 확장 기능의 동적로드 ( enable_dl 구성 지시문을 통한 ) [193] 를 사용하면 보안 문제가 발생할 수 있습니다. [194] [195]
또한 호환되지 않는 값을 가져 오는 묵시적인 형식 변환 은 프로그래머의 의도와 동일하게 취급되므로 보안 문제가 발생할 수 있습니다. 예를 들어 첫 번째로 비교 된 값이 ( 0 × 10 1234 ) 즉 0 인 과학 표기법으로 처리되므로 비교 "0e1234"== "0" 비교의 결과가 참 입니다. 이 기능에 인증 결과 취약점 간단한 기계 포럼 , [196] TYPO3 [197] 과 의 phpBB [198] 때 MD5의 암호 해시 비교했다. 대신 strcmp 함수 또는 ID 연산자 ( === )를 사용해야합니다. "0e1234"=== "0" 은 거짓으로 나타납니다 . 또한,
Zone-H 에서 게시 한 170,000 개가 넘는 웹 사이트 오류에 대한 2013 년 분석 에서 가장 많이 사용 된 기술 (53 %)은 파일 포함 취약점의 악용이었으며 대부분 include , require 및 allow_url_fopen PHP 기능의 안전하지 않은 사용과 관련이 있었습니다. [200 ]
출처 위키백과