PHP (プログラミング言語)

PHP（ピー・エイチ・ピー）は、 "The PHP Group" によってコミュニティベースで開発されているオープンソースの汎用プログラミング言語およびその公式の処理系であり、特にサーバーサイドで動的なウェブページを作成するための機能を多く備えていることを特徴とする。
名称の PHP は再帰的頭字語として、 "" を意味するとされており、「PHPはHTMLのプリプロセッサである」とPHP自身を再帰的に説明している。

 概要 
PHPはラスマス・ラードフが個人的にCで開発していたCGIプログラムである "" （短縮されて "" と呼ばれていた）を起源とする。
元々はラードフ自身のWebサイトで簡単な動的Webページを作成するために用いられていたが、その後データベースへのアクセス機能などを追加したPHP Toolsを1995年にGPLの下で公開した。
オープンソースライセンスの下で公開されたことにより同ツールの利用者が増加し、機能の追加を行う開発者たちの貢献もあって、幾度かの大きなバージョンアップを経て今日に至っている。
PHPの再帰的頭字語が PHP: Hypertext Preprocessor となったのは2017年現在の文法の基礎が確立したPHP 3からである。

先に述べたように、PHPは動的なWebページを生成するツールを起源としているため、公式の処理系にはWebアプリケーション開発に関する機能が豊富に組み込まれている。
元々PHPはプログラミング言語と言えるものではなく、単にテンプレート的な処理を行うだけであったが、度重なる機能追加やコードの書き直しにより、2017年現在リリースされているPHP 5やPHP 7は目的によらず汎用的に使うことの出来るスクリプト言語となっている。
特にApache HTTP ServerやnginxといったWebサーバーソフトウェアから動作させるスクリプト言語として選択されてサーバーサイドWebアプリケーション開発に利用されることが多い。

プログラミング言語としてのPHPは、CやPerl, Javaなどのプログラミング言語に強く影響を受けており、これらの言語に近く学習しやすい文法を有する。
組み込み関数についてもこれらの言語から直接輸入されたものも多く、関数名を変えずにそのまま取り込んだことで標準関数の命名規則が一貫していないといった問題も有している。
またC由来のヌル終端文字列とヌル文字を含むことを許容する文字列とが併存し、関数によってどちらを取り扱うかが異なっていたために深刻なセキュリティ上の問題を起こしたこともある。

PHPで書かれたライブラリは、PEARを利用してシステムワイドにインストールしたりユーザ単位で利用することが多かったが、2012年にRubyのパッケージ管理ツールであるRubyGems及び依存関係管理ツールbundler、Node.jsのnpmに影響を受けて開発されたComposerが公開されたことにより、パッケージリポジトリPackagistに登録されたライブラリをプロジェクト単位で利用することが容易になった。

PHP製のWebアプリケーションフレームワークが増加したことにより、それらが提供するロガーやHTTPリクエストハンドラなどといった共通の機能を実装するコードの再利用性を高めるため、2010年頃にフレームワーク開発者などが集まってPHP Standard Groupを立ち上げた。
PHP Standard Groupはその後PHP-FIG (Framework Interoperability Group)に改称し、クラスオートローディングの規格やコーディング規約などの推奨される標準規格、PSR (PHP Standards Recommendations)の策定を行っている。

 プログラミング言語としての特徴 
 HTML埋め込み型の構文（Hypertext Preprocessorたる所以）
 弱い動的型付け
 クラスベースオブジェクト指向のサポート
 例外処理 (try, catch, throw) のサポート

 処理系としての特徴 
 サーバーサイドWebアプリケーション構築のための豊富な組み込み関数
 データベースへの容易なアクセス（ベンダーごとの組み込み関数、PDO）
 PECLによる言語機能の拡張
 多くのWebサーバへの組み込みの標準サポート

 構文 
プログラミング言語としてのPHPはCやPerlなどの影響を強く受けており、同じくこれらに影響を受けたRubyやPythonと比較してよりCそのままに近い制御構文を有している。
またクラスやインターフェイスといったオブジェクト指向構文はC++よりJavaに近いものが採用されている。
文法の近さによって利用者の多いCやJavaからPHPを学んだり、その逆も行いやすいことは言語の学習コストの面からは大きな利点である。

 Hello world 
PHPによるHello worldの最も簡単な実装は、単にテキストファイルとして「Hello world」を記述するだけでよい。
Hello world!

PHPはテキストファイルにHTMLタグのように埋め込んで書き、それ以外の部分はそのまま出力されるため、上記は（プログラムとして実行される部分は存在しないものの）正しく処理系によって認識されて「Hello world!」を出力する。
もう少しプログラムらしい書き方をすれば次のような記述が出来る。
<?php echo 'Hello world!'; ?>

PHPの処理系はPHPタグ<?php ?>で囲われた部分を解釈・実行し、その外側の部分はそのまま文字列として出力する。
単純にデータを出力する場合にはPHPタグを<?= ?>と略記することが可能であり、更にPHPタグがファイルの末尾にある場合はファイル末尾の空白や改行の影響を避けるためにPHPタグを閉じないことが推奨されるので、次のように書いても同じ結果が得られる。
<?='Hello world!'

 文字列と数値の違い 
次のように、数値として「 5+2 」を行うと7が出力される。ただし「5+2」をシングルクォーテーションやダブルクォーテーションで囲むと、文字列と解釈されてそのまま出力される。
<?php 
 echo 5+2; //結果: 7
 echo '5+2'; //結果: 5+2
?>

 文字列合成 
他のjsやrubyでは下のように(言語はJavaScript)
console.log("Hello " + "world!"); // 結果: Hello world!
と文字列を 「+」 で合成できるが、phpでは
<?php 
 echo 'Hello ' + 'world!'; // 結果: Error
 echo 'Hello ' . 'world!'; // 結果: Hello world!
?>
と、「 . 」のようにドットで合成しなければならない

 処理系 
プログラミング言語としてのPHPを実行するための The PHP Group による公式な処理系の実装も、プログラミング言語としてのPHPと区別されることなく PHP と呼ばれる。
2014年頃までプログラミング言語としてのPHPには規格などが存在しなかったため、公式の処理系の実装およびマニュアルの記述がその代わりとなっていた。
2018年1月現在では、作業中となっているが、プログラミング言語としての仕様は処理系の実装と分かれて文書化されている。

この実装はCで書かれており、PHP LicenseおよびZend Engine Licenseの下で公開されている自由なソフトウェアである。
PHP4以降において、プログラミング言語としてのPHPを解釈・実行するエンジンとしてZend Engineが使用されており、PHP5よりZend Engine 2、PHP7ではZend Engine 3へと順次バージョンアップされている。
Zend EngineはPHP 3の主要な開発者であるアンディ・ガトマンズおよびゼーブ・スラスキー（後にZend Technologies Ltd.を設立）により設計・開発されたスクリプト言語エンジンであり、現在はThe PHP GroupによりPHPと共に開発されている。
Zend Engineは1つのプロセスが1つのインタプリタのコンテキストを持つように設計されていて、単独ではマルチスレッドを用いた処理をサポートしていない。
PHPはそのソースコードのほとんどがPHP Licenseの下でリリースされるが、Zend EngineのコードについてはZend Engine Licenseが適用される。

実際のPHPの構成はZend Engineに加え、PHPの組み込み関数の実装、Webサーバや標準入出力とスクリプティングエンジンの間を仲介するSAPI (Server API) レイヤ、マルチスレッドで動くWebサーバのモジュールとして利用される場合にグローバル変数のセマンティクスを提供するTSRM (Thread Safe Resource Manager)、プラットフォーム間での入出力機構やAPIの差異を吸収するStreamsレイヤを含む。
一部の組み込み関数はプラットフォームごとに挙動が違うため、スクリプトによっては移植作業が必要になる場合がある。

 PECLによる拡張 
公式の処理系に対して、CやC++で記述された拡張ライブラリを提供する PECL (The PHP Extension Community Library) というプロジェクトが存在する。
基本的にPECLのライブラリは標準ではPHPに組み込まれてはいないものが多いが、PECLで開発されていたライブラリがPHPの本体に標準でバンドルされるようになったり(PDO)、逆に非推奨となった機能が本体より取り除かれ、PECLでメンテナンスが継続される(mcrypt)こともあり、拡張機能としてはPHPの準標準と言える立ち位置にある。

 対応する主要DBMS 
PHPは数多くのDBMSを標準でサポートしている。
提供されるAPIは、ベンダ固有モジュールというDBMS毎に提供される専用モジュールによるものと、ベンダ毎の差異を吸収して一貫したインターフェイスで様々なDBMSに接続出来るデータベース抽象化レイヤとがある。
特にデータベースをより高度に抽象化して扱うライブラリなどでは、様々なDBMSに対応するためにPHP5.1で標準になったデータベース抽象化レイヤ PDO をバックエンドとして選択するものが多い。

 Apache Derby
 DB2
 Informix Dynamic Server
 InterBase
 Microsoft SQL Server
 mSQL
 MySQL / MariaDB
 ODBC
 Oracle Database
 PostgreSQL
 Sybase Adaptive Server Enterprise
 SQLite
 Redis

 Webサーバとの統合 
PHPをWebサーバで動作させる方法には、実行ファイル形式 (CGI / FastCGI)、モジュール形式（mod_phpなど）がある。
どの方法を利用するか（利用出来るか）はWebサーバにより異なる。
実行ファイル形式によるCGIはほぼ全てのWebサーバに対応しているが、Apacheで動作させる場合はmod_phpとFastCGI、IIS、lighttpdやNginxで動作させる場合はFastCGIが利用可能である。

PHPに標準で実装されているWebサーバ用API (SAPI)の一覧を以下に挙げる。以前はこのほかにも存在したがPHP 7.0で削除された。

 CGI / FastCGI
 FastCGIについては、php-cgiプログラムとFastCGI Process Manager (FPM)の2種類が用意されている。
 Apache HTTP Server
 

とくに、HTTPリクエストの度にプロセスを起動させないインタフェース（Apacheとmod_phpの組み合わせ、またはlighttpdなどのFastCGIに対応したWebサーバ）での動作が高速である。

 その他の処理系 
PHPの処理系は公式の実装を含めいくつかの異なる実装が存在する。
そのうち比較的よく知られているものについて簡単に記述する。

 HHVM (HipHop Virtual Machine) (PHP License, Zend Engine License)
 Facebookによって開発された処理系で、実行の高速化のために実行時(JIT)コンパイル方式を採用している。HHVMは実行時にソースコードをHipHopバイトコードと呼ばれる独自の中間言語にコンパイルし、そこから動的に機械語にコンパイル/最適化を経て実行される。ただし、HHVM4.0 以降はPHPから派生した言語であるHack専用となり、PHP自体のサポートは削除された。

 Phalanger (Apache License)
 プラハ・カレル大学のオープンソースプロジェクトとして開発されている処理系で、PHPのソースコードをCILバイトコードにコンパイルすることにより.NET Framework上で動作させることを可能にしている。

 PHPで書かれたソフトウェア 
PHPは学習コストの低さ、記述の容易さから多くのアプリケーションが開発されている。
Wikipediaを動作させているアプリケーションであるMediaWikiもPHPによって記述されている。

本節ではPHPで書かれた代表的なアプリケーションを列挙する。

 ウェブアプリケーション、CMSなど 
 IBM WebSphere sMash
 MediaWiki
 phpBB
 phpMyAdmin
 PukiWiki
 Serendipity Weblog System
 SilverStripe CMS
 WordPress
 XOOPS
 OpenPNE
 KinagaCMS

 ウェブアプリケーション・フレームワーク 
 CakePHP
 CodeIgniter
 Cosmos
 Ethna
 eZ components
 Zeta Components
 FuelPHP
 Kohana
 Laravel
 Lithium
 PHP on TRAX
 PRADO
 Risoluto
 Seasar.PHP
 Symfony
 WACT
 xFramework
 Yii
 Zend Framework
 ちいたん
 Chimpanzee

 テンプレートエンジン 
 Smarty
 Twig

 歴史 

 前史 
ラスマス・ラードフは自身のWebページで利用するため、1994年にCで書かれたCGI用バイナリ群を作成し、 "Personal Home Page Tools" と命名した。
このCGIソフトウェアは略して "PHP Tools" と呼ばれることが多かったようである。
その後、利用者からの機能要望が増えたため、オリジナルのPHP Toolsは大きく書き直され、データベースを利用することが出来るようになった。
単純なツール群から一種のフレームワークとしての機能を有するようになったのである。
ラードフは1995年6月8日にGPLの下でPHP Toolsを公開、オープンソースソフトウェアとして最初のリリースを行った。

1995年9月、ラードフはPHP Toolsを発展させ、現在のPHPにも受け継がれている特徴、Perl風の変数名やHTMLフォームデータの自動取得、そしてHTMLへの埋め込み型の記述方式などを持ったツール "FI" (Form Interpreter) を実装した。
翌月にはFIを完全に書き直し、 "Personal Home Page Construction Kit" という名前でリリースを行い、CやPerlに近い構文を有する簡易スクリプトツールへと発展した。

このツールは再び一から書き直され、ユーザ定義関数のサポートなど、プログラミング言語としての機能を有するようになった。
1996年4月になるとPHPとFIの名称を合わせた "PHP/FI" として公開された。
同年6月に、後にPHP 2として言及される "PHP/FI Version 2.0" のベータ版がリリースされた。
PHP/FI Version 2.0は翌1997年11月に正式版がリリースされ、その後1998年1月に一度アップデートが行われたあとはメンテナンスは行われなかった。

 PHP 3 
イスラエルのアンディ・ガトマンズとゼーブ・スラスキーは、e-コマースアプリケーションを開発するためにPHP/FI Version 2.0を利用しようと考えていたが、PHP/FIには機能が不足していた。
そこで1997年、彼らはラードフに対してPHP/FIを作り直す方法を検討していることを伝えた。
ガトマンズとスラスキ―はPHP/FIで使われていたパーサを書き直し、ラードフとも協力して新たなプログラミング言語を開発した。
この言語は再び "PHP" と命名されたが、"Personal Home Page Tools"が抱えていた個人用という印象を避けるため、新しく "PHP: Hypertext Preprocessor" という再帰的頭字語を与えられることになった。
1998年6月、ラードフ、ガトマンズそしてスラスキーに加え、世界中の開発者らが立ち上げたPHP Development Teamは "PHP 3.0" をPHP/FI Version 2.0の後継として、GPLとPHP Licenseとのデュアルライセンスの下でリリースした。

 PHP 4 
PHP 3.0がリリースされて間もなく、ガトマンズとスラスキーはPHPのプログラミング言語を処理するコアの部分の再設計を行い、新しく作り上げた実行エンジンを彼らの名前からとって "Zend Engine" と命名した。
2000年5月、このZend Engineを使用した大幅なパフォーマンスの改善を行い、より多くのWebサーバのサポートなどの機能拡張を行った新しいバージョンである"PHP 4.0"がリリースされた。
PHP 4ではコピーレフト条項がPHPの利用拡散を妨げるという判断により、ライセンスからGPLが外れてPHP LicenseおよびZend EngineのコードについてはZend Engine Licenseが適用されることになった。

PHP 4は4.0から4.4までがリリースされ、2008年8月にセキュリティ対応を含めた全ての開発が終了している。

 PHP 5 
2004年7月、新たにZend Engine 2をコアとし、オブジェクト指向構文をより一層強化したバージョンである "PHP 5.0" がリリースされた。
マイナーアップデートにより様々な機能の追加が行われ、DBMSへの一貫したアクセスインターフェイスを提供する抽象化レイヤPDOが導入されたり、PHPが欠いていた名前空間、静的遅延束縛、クロージャなどをはじめとしたプログラミング言語としての機能強化が頻繁に取り入れられている。

PHP 5.4では特筆すべき機能として開発用の組み込みWebサーバが導入されており、他のWebサーバを導入しなくともWebアプリケーション開発が容易に行えるようになった。
PHP 5.6では対話式デバッガがSAPIとして組み入れられた。

PHP 5は既に開発が終了しており、最終バージョンであるPHP 5.6のセキュリティ対応も2018年12月31日をもって終了した。

 PHP 6 
PHP 5.3の次のリリースとなるべく開発されていたバージョンで、エンジンの内部処理がUTF-16に置き換えられる計画であったが、多くの問題に見舞われたことから2010年に開発が断念されている。
PHP 5.3の次のリリースはPHP 5.4へと置き換えられ、また次のPHPのメジャーリリースがPHP 7とされたことでPHP 6は欠番となった。

 PHP 7 
2015年12月に内部エンジンをZend Engine 3とした"PHP 7.0"がリリースされた。
Zend Engineの改善を行うPHPNG (PHP Next-Gen) プロジェクトの成果を取り入れており、データ構造の改善などにより、前バージョンのPHP 5.6と比べて25%から70%の性能改善が図られている。
また言語仕様も大きく拡張されており、引数のタイプヒンティングにスカラー型が指定できるようになる（タイプヒンティングは5.1で導入されたが、クラスや配列など一部の型に限られていた）他、戻り値へのタイプヒンティングも導入されており、前年に発表されたHHVM用プログラミング言語Hackの影響が見受けられるものになっている。

 PHP 8 
2020年11月に"PHP 8.0"がリリースされた。

 リリース履歴 
+ 凡例 色 意味 メンテナンスの状況 赤 旧版 メンテナンス終了 黄 安定版 セキュリティ対応のみ 緑 安定版 バグ修正とセキュリティ対応 青 開発版 新機能の追加

 Ver. メンテナンスの状況 リリース日時 サポート期限 特記事項 アクティブ セキュリティ 1.0 旧版 正式名称は"Personal Home Page Tools (PHP Tools)". "PHP"という名称が使用された最初のバージョン。 2.0 旧版 正式名称は"PHP/FI 2.0". 今日まで続くプログラミング言語としてのPHPが成立した最初のバージョン。 3.0 旧版 このバージョンからコミュニティーベースの開発に移行した。特にアンディ・ガトマンズやゼーブ・スラスキーが基礎となる部分を大幅に書き直した。 4.0 旧版 Zend Engineを導入し、コードのパース部分と実行部分とが分離された。 4.1 旧版 スーパーグローバル変数の導入 (, , , etc.) 4.2 旧版 register_globalsが標準で無効化された。これによりセキュリティホールの原因となりがちだった外部入力をチェック無しで直接グローバル変数に格納する処理が行われなくなった。 4.3 旧版 これまで提供されていたCGI用SAPIに加えてコマンドラインインターフェイス(CLI-SAPI)が導入された。 4.4 旧版 メモリ破損の脆弱性を修正した。これによりバイナリ互換性が崩れ、PHP version 4.3.x向けにビルドされた拡張が使用出来なくなった。 5.0 旧版 Zend Engine 2の導入とオブジェクト指向構文の刷新。 5.1 旧版 大幅なパフォーマンス改善。 一貫したデータベースアクセスインターフェイスを提供するPHP Data Objects (PDO)の導入。 5.2 旧版 フィルター拡張を標準で有効に。JSONサポートを標準化。 5.3 旧版 名前空間のサポート、 静的遅延束縛、goto演算子、クロージャ、PHPアーカイブ (phar)、循環参照に対するガベージコレクション、Windowsサポートの改善、SQLite3、MySQL関数のバックエンドライブラリをlibmysqlからmysqlndに置き換え、MIMEサポートの改善のためmime_magic拡張の代替としてfileinfo拡張を追加、i18n拡張、ereg拡張の非推奨化。 5.4 旧版 トレイトのサポート、配列の短縮記法の導入。register_globals, safe_mode, allow_call_time_pass_reference, , および の削除。ビルトインWebサーバ。 既存の機能に対するいくつかの改善、パフォーマンスの向上とメモリの削減。 5.5 旧版 ジェネレータおよび例外処理に於けるfinallyブロックの導入、OpCache （Zend Optimizer+に基く）のバンドル。 5.6 旧版 定数式、可変長引数関数、引数の展開演算子(...)、累乗演算子(**)、定数と関数に対する文、対話型デバッガphpdbgをSAPIモジュールとしてバンドル、その他細かな改善。 mysql_で始まる関数名が非推奨となる。 6.x ネイティブUnicodeサポートを含むことを検討されていたが、最終的にリリースされず欠番となった。 7.0 旧版 Zend Engine 3 (パフォーマンスの改善とWindowsでの64-bit整数サポート)、可変変数に対する構文の統一、 ASTに基くコンパイル、の追加、 ビットシフト演算のプラットフォーム依存性の排除、 null合体演算子、 エスケープシーケンス構文によるUnicodeコードポイント指定、関数の戻り値の宣言構文、スカラー型のタイプヒンティング、 宇宙船演算子<=>、 ジェネレータの委譲、無名クラス、より良い暗号論的擬似乱数生成器、PHPの内部エラーを例外で置き換え、複数の対象をuseする場合の短縮構文 バージョン5.5で非推奨となっていたMySQLの拡張機能が削除された。 7.1 旧版 iterable型、nullable型、戻り値のvoid型、クラス定数の 可視性の宣言、短縮リスト構文、複数例外のキャッチ 7.2 旧版 オブジェクト引数と戻り値の型宣言,、Sodiumがコアモジュールに、抽象メソッドのオーバーライド、パラメータの型の拡大変換、countableでない型のオブジェクトに対するで警告を発生するように 7.3 旧版 ヒアドキュメントとNowdoc構文がより柔軟に、リファレンスへの分割代入のサポート、PCRE2のサポート、 hrtime()関数 7.4 旧版 アロー関数、型付きプロパティ、OPcacheでの事前ロード、Null合体代入演算子、openssl_random_pseudo_bytes()の改善、弱い参照、FFI Foreign function interface拡張モジュール、hash拡張モジュールが常に有効に、password_hash()の改善、mb_str_split()の追加、リファレンスへのリフレクション、wddx拡張モジュールがPECLへ移動、カスタムオブジェクトのシリアライズのためのマジックメソッド 8.0 旧版 JITコンパイラ、負のインデックスで始まる配列、トレイトでprivateな抽象メソッドを定義可能に、文字列と数値の比較の改善、数値を示す文字列の改善、算術演算子/ビット演算子で演算不能時にTypeErrorをスローするように、PHPエンジンのエラーを再分類、組込関数の一貫した型エラー、非互換なメソッドのシグネチャが致命的なエラーに)、float型から文字列型へのキャストがロケール非依存に、多数の構文の調整、アトリビュート、名前付き引数、match式、コンストラクタ引数のプロパティ昇格機能、union型、mixed型、戻り値としてのstatic型、nullsafe演算子、変数に保存せずに例外をキャッチする構文、throw式、JSON拡張モジュールが常に有効に 8.1 旧版 明示的な8進数プレフィックス、列挙型、readonlyプロパティ、第一級callable生成記法、初期化時のnew式の許可、交差型、戻り値のnever型、クラス定数のfinal指定、ファイバー 8.2 安定版 Readonlyクラス、null, false, trueが独立した型に、大文字小文字変換がロケール非依存に、DNF型、トレイトでの定数 8.3 安定版 型付きクラス定数、クラス定数への動的なアクセス構文、アトリビュート、readonlyプロパティのclone中の再初期化、json_validate()関数、乱数生成関数、CLIで複数ファイルの文法チェックに対応 8.4 安定版 プロパティフック、非対称可視性、アトリビュート、DOM 拡張モジュールの新機能と HTML5サポート、BCMathのオブジェクトAPI