PHP (ピー・エイチ・ピー)は、 "The PHP Group" によってコミュニティベースで開発[2] されているオープンソース の汎用プログラミング言語 およびその公式の処理系 であり、特にサーバーサイドで動的なウェブページ を作成するための機能を多く備えていることを特徴とする[3] 。名称の PHP は再帰的頭字語 として、 "PHP: Hypertext Preprocessor " を意味[4] [5] するとされており、「PHPはHTML のプリプロセッサ である」とPHP自身を再帰的に説明している。
概要 PHPはラスマス・ラードフ が個人的にC で開発していたCGI プログラムである "Personal Home Page Tools " (短縮されて "PHP Tools " と呼ばれていた)を起源とする[5] 。元々はラードフ自身のWebサイトで簡単な動的Webページを作成するために用いられていたが、その後データベースへのアクセス機能などを追加したPHP Toolsを1995年にGPL の下で公開した[6] 。オープンソースライセンスの下で公開されたことにより同ツールの利用者が増加し、機能の追加を行う開発者たちの貢献もあって、幾度かの大きなバージョンアップを経て今日に至っている。PHPの再帰的頭字語 が PHP: Hypertext Preprocessor となったのは2017年現在の文法の基礎が確立したPHP 3から[5] である。
先に述べたように、PHPは動的なWebページを生成するツールを起源としているため、公式の処理系にはWebアプリケーション開発に関する機能が豊富に組み込まれている。元々PHPはプログラミング言語と言えるものではなく、単にテンプレート的な処理を行うだけであったが、度重なる機能追加やコードの書き直しにより、2017年現在リリースされているPHP 5やPHP 7は目的によらず汎用的に使うことの出来るスクリプト言語となっている。特にApache HTTP Server やnginx といったWebサーバー ソフトウェアから動作させるスクリプト言語として選択されてサーバーサイドWebアプリケーション開発に利用されることが多い。
プログラミング言語としてのPHPは、C やPerl , Java などのプログラミング言語に強く影響を受けており、これらの言語に近く学習しやすい文法を有する。組み込み関数についてもこれらの言語から直接輸入されたものも多く、関数名を変えずにそのまま取り込んだことで標準関数の命名規則が一貫していないといった問題も有している。またC 由来のヌル終端文字列 とヌル文字 を含むことを許容する文字列とが併存し、関数によってどちらを取り扱うかが異なっていたために深刻なセキュリティ上の問題を起こしたこともある[7] 。
PHPで書かれたライブラリは、PEAR を利用してシステムワイドにインストールしたりユーザ単位で利用することが多かったが、2012年にRuby のパッケージ管理ツールであるRubyGems 及び依存関係管理ツールbundler 、Node.js のnpm に影響を受けて開発されたComposer が公開されたことにより、パッケージリポジトリPackagist[8] に登録されたライブラリをプロジェクト単位で利用することが容易になった。
PHP製のWebアプリケーションフレームワークが増加したことにより、それらが提供するロガーやHTTPリクエストハンドラなどといった共通の機能を実装するコードの再利用性を高めるため、2010年頃にフレームワーク開発者などが集まってPHP Standard Groupを立ち上げた[9] 。PHP Standard Groupはその後PHP-FIG (Framework Interoperability Group)に改称し、クラスオートローディングの規格やコーディング規約などの推奨される標準規格、PSR (PHP Standards Recommendations)の策定を行っている[10] 。
プログラミング言語としての特徴 処理系としての特徴 サーバーサイドWebアプリケーション構築のための豊富な組み込み関数 データベースへの容易なアクセス(ベンダーごとの組み込み関数、PDO ) PECL による言語機能の拡張多くのWebサーバへの組み込みの標準サポート 構文 プログラミング言語 としてのPHPはC やPerl などの影響を強く受けており、同じくこれらに影響を受けたRuby やPython と比較してよりCそのままに近い制御構文を有している。またクラス やインターフェイス といったオブジェクト指向構文はC++ よりJava に近いものが採用されている。文法の近さによって利用者の多いCやJavaからPHPを学んだり、その逆も行いやすいことは言語の学習コストの面からは大きな利点である。
Hello world PHPによるHello world の最も簡単な実装は、単にテキストファイルとして「Hello world」を記述するだけでよい。
PHPはテキストファイルにHTML タグのように埋め込んで書き、それ以外の部分はそのまま出力されるため、上記は(プログラムとして実行される部分は存在しないものの)正しく処理系によって認識されて「Hello world!」を出力する。もう少しプログラムらしい書き方をすれば次のような記述が出来る。
<?php echo 'Hello world!' ; ?> PHPの処理系はPHPタグ <?php ?>
で囲われた部分を解釈・実行し、その外側の部分はそのまま文字列として出力する。単純にデータを出力する場合にはPHPタグを<?= ?>
と略記することが可能であり、更にPHPタグがファイルの末尾にある場合はファイル末尾の空白や改行の影響を避けるためにPHPタグを閉じないことが推奨されるので、次のように書いても同じ結果が得られる。
文字列と数値の違い 次のように、数値 として「 5+2 」を行うと7が出力される。ただし「5+2」をシングルクォーテーション やダブルクォーテーション で囲むと、文字列 と解釈されてそのまま出力される。
<?php echo 5 + 2 ; //結果: 7 echo '5+2' ; //結果: 5+2 ?> 処理系 プログラミング言語としてのPHPを実行するための The PHP Group による公式な処理系の実装 も、プログラミング言語としてのPHPと区別されることなく PHP と呼ばれる。2014年頃までプログラミング言語としてのPHPには規格などが存在しなかった[11] ため、公式の処理系の実装およびマニュアルの記述がその代わりとなっていた。2018年1月現在では、作業中となっているが、プログラミング言語としての仕様は処理系の実装と分かれて文書化されている[12] 。
この実装は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[※ 1] )こともあり、拡張機能としてはPHPの準標準と言える立ち位置にある。
対応する主要DBMS PHPは数多くのDBMS を標準でサポートしている。提供されるAPIは、ベンダ固有モジュール というDBMS毎に提供される専用モジュールによるものと、ベンダ毎の差異を吸収して一貫したインターフェイスで様々なDBMSに接続出来るデータベース抽象化レイヤ とがある。特にデータベースをより高度に抽象化して扱うライブラリなどでは、様々なDBMSに対応するためにPHP5.1で標準になったデータベース抽象化レイヤ PDO をバックエンドとして選択するものが多い。
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で削除された[13] 。
とくに、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など ウェブアプリケーション・フレームワーク テンプレートエンジン
歴史 前史 ラスマス・ラードフ は自身の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の利用拡散を妨げるという判断[14] により、ライセンスから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へと置き換えられ[15] 、また次のPHPのメジャーリリースがPHP 7とされたことでPHP 6は欠番となった。
PHP 7 2015年12月に内部エンジンをZend Engine 3とした"PHP 7.0 "がリリースされた[16] 。Zend Engineの改善を行うPHPNG (PHP Next-Gen) プロジェクトの成果を取り入れており、データ構造の改善などにより、前バージョンのPHP 5.6と比べて25%から70%の性能改善が図られている。また言語仕様も大きく拡張されており、引数のタイプヒンティングにスカラー型が指定できるようになる[17] (タイプヒンティングは5.1で導入されたが、クラスや配列など一部の型に限られていた)他、戻り値へのタイプヒンティング[18] も導入されており、前年に発表されたHHVM 用プログラミング言語Hack の影響が見受けられるものになっている。[19]
PHP 8 2020年11月に"PHP 8.0 "がリリースされた[20] 。
リリース履歴 凡例 色 意味 メンテナンスの状況 赤 旧版 メンテナンス終了 黄 安定版 セキュリティ対応のみ 緑 安定版 バグ修正とセキュリティ対応 青 開発版 新機能の追加
Ver. メンテナンスの状況 リリース日時 サポート期限[21] [22] 特記事項 アクティブ セキュリティ 1.0 旧版 1995-06-08 正式名称は"Personal Home Page Tools (PHP Tools)". "PHP"という名称が使用された最初のバージョン。[5] 2.0 旧版 1997-11-01 正式名称は"PHP/FI 2.0". 今日まで続くプログラミング言語としてのPHPが成立した最初のバージョン。 3.0 旧版 1998-06-06 2000-10-20[22] このバージョンからコミュニティーベースの開発に移行した。特にアンディ・ガトマンズやゼーブ・スラスキーが基礎となる部分を大幅に書き直した。[5] 4.0 旧版 2000-05-22 2001-06-23[22] Zend Engineを導入し、コードのパース部分と実行部分とが分離された。[23] 4.1 旧版 2001-12-10 2002-03-12[22] スーパーグローバル変数の導入 ($_GET
, $_POST
, $_SESSION
, etc.)[23] 4.2 旧版 2002-04-22 2002-09-06[22] register_globals
が標準で無効化された。これによりセキュリティホールの原因となりがちだった外部入力をチェック無しで直接グローバル変数に格納する処理が行われなくなった。[23] 4.3 旧版 2002-12-27 2005-03-31[22] これまで提供されていたCGI用SAPIに加えてコマンドラインインターフェイス (CLI-SAPI)が導入された。[23] [24] 4.4 旧版 2005-07-11 2008-08-07[22] メモリ破損の脆弱性を修正した。これによりバイナリ互換性が崩れ、PHP version 4.3.x向けにビルドされた拡張が使用出来なくなった。[25] 5.0 旧版 2004-07-13 2005-09-05[22] Zend Engine 2の導入とオブジェクト指向構文の刷新。[26] 5.1 旧版 2005-11-24 2006-08-24[22] 大幅なパフォーマンス改善。[26] 一貫したデータベースアクセスインターフェイスを提供するPHP Data Objects (PDO)の導入。[27] 5.2 旧版 2006-11-02 2011-01-06[22] フィルター拡張を標準で有効に。JSON サポートを標準化。[26] 5.3 旧版 2009-06-30 2014-08-14[22] 名前空間 のサポート、 静的遅延束縛 、goto 演算子、クロージャ 、PHPアーカイブ (phar)、循環参照 に対するガベージコレクション 、Windows サポートの改善、SQLite3 、MySQL 関数のバックエンドライブラリをlibmysqlからmysqlndに置き換え、MIME サポートの改善のためmime_magic拡張の代替としてfileinfo拡張を追加、i18n 拡張、ereg拡張の非推奨化。5.4 旧版 2012-03-01 2015-09-03[22] トレイト のサポート、配列の短縮記法の導入。register_globals
, safe_mode
, allow_call_time_pass_reference
, session_register ()
, session_unregister ()
および session_is_registered ()
の削除。ビルトインWebサーバ。[28] 既存の機能に対するいくつかの改善、パフォーマンスの向上とメモリの削減。5.5 旧版 2013-06-20 2016-07-10[21] ジェネレータ および例外処理 に於けるfinallyブロックの導入、OpCache (Zend Optimizer+に基く)のバンドル。[29] 5.6 旧版 2014-08-28 2017-01-19[21] 2018-12-31[21] 定数式、可変長引数関数 、引数の展開演算子(...
)、累乗演算子(**
)、定数と関数に対するuse 文、対話型デバッガphpdbgをSAPIモジュールとしてバンドル、その他細かな改善。[30] mysql_
で始まる関数名が非推奨となる。 6.x N/A 破棄 N/A N/A ネイティブUnicode サポートを含むことを検討されていたが、最終的にリリースされず欠番となった。[31] [32] 7.0 旧版 2015-12-03[33] 2017-12-03[21] 2018-12-03[34] Zend Engine 3 (パフォーマンスの改善[35] とWindowsでの64-bit整数サポート[36] )、可変変数に対する構文の統一[37] 、 AST に基くコンパイル[38] 、Closure :: call ()
の追加[39] 、 ビットシフト演算 のプラットフォーム依存性の排除[40] 、 null合体演算子 ??
[41] 、 エスケープシーケンス 構文によるUnicode コードポイント指定[42] 、関数の戻り値の宣言構文[18] 、スカラー型のタイプヒンティング[17] 、 宇宙船演算子 <=>
[43] 、 ジェネレータ の委譲[44] 、無名クラス[45] 、より良い暗号論的擬似乱数生成器 [46] 、PHPの内部エラーを例外 で置き換え[47] 、複数の対象をuseする場合の短縮構文[48] バージョン5.5で非推奨となっていたMySQLの拡張機能が削除された。 7.1 旧版 2016-12-01 2018-12-01[21] 2019-12-01[21] iterable型[49] 、nullable型[50] 、戻り値のvoid 型[51] 、クラス定数の 可視性 の宣言[52] 、短縮リスト構文[53] 、複数例外のキャッチ[54] 7.2 旧版 2017-11-30 2019-11-30[21] 2020-11-30[21] オブジェクト引数と戻り値の型宣言,[55] 、Sodiumがコアモジュールに[56] 、抽象メソッドのオーバーライド[57] 、パラメータの型の拡大変換[58] 、countableでない型のオブジェクトに対するcount ()
で警告を発生するように[59] 7.3 旧版 2018-12-06 2020-12-06[21] 2021-12-06[21] ヒアドキュメントとNowdoc構文がより柔軟に[60] 、リファレンスへの分割代入のサポート[61] 、PCRE2のサポート[62] 、 hrtime()関数[63] 7.4 旧版 2019-11-28 2021-11-28[21] 2022-11-28[21] アロー関数、型付きプロパティ[64] 、OPcacheでの事前ロード[65] 、Null合体代入演算子[66] 、openssl_random_pseudo_bytes()の改善[67] 、弱い参照[68] 、FFI – Foreign function interface 拡張モジュール[69] 、hash拡張モジュールが常に有効に[70] 、password_hash()の改善[71] 、mb_str_split()の追加[72] 、リファレンスへのリフレクション[73] 、wddx拡張モジュールがPECLへ移動[74] 、カスタムオブジェクトのシリアライズのためのマジックメソッド[75] 8.0 旧版 2020-11-26 2022-11-26[21] 2023-11-26[21] JITコンパイラ [76] 、負のインデックスで始まる配列[77] 、トレイトでprivateな抽象メソッドを定義可能に[78] 、文字列と数値の比較の改善[79] 、数値を示す文字列の改善[80] 、算術演算子/ビット演算子で演算不能時にTypeErrorをスローするように[81] 、PHPエンジンのエラーを再分類[82] 、組込関数の一貫した型エラー[83] 、非互換なメソッドのシグネチャが致命的なエラーに[84] )、float型から文字列型へのキャストがロケール非依存に[85] 、多数の構文の調整[86] 、アトリビュート[87] [88] [89] [90] 、名前付き引数[91] 、match式[92] 、コンストラクタ引数のプロパティ昇格機能[93] 、union型[94] 、mixed型[95] 、戻り値としてのstatic型[96] 、nullsafe演算子[97] 、変数に保存せずに例外をキャッチする構文[98] 、throw式[99] 、JSON拡張モジュールが常に有効に[100] 8.1 安定版 2021-11-25 2023-11-25[21] 2024-11-25[21] 明示的な8進数プレフィックス[101] 、列挙型[102] 、readonlyプロパティ[103] 、第一級callable生成記法[104] 、初期化時のnew式の許可[105] 、交差型[106] 、戻り値のnever型[107] 、クラス定数のfinal指定[108] 、ファイバー [109] 8.2 安定版 2022-12-08 2024-12-08[21] 2025-12-08[21] Readonlyクラス[110] 、null, false, trueが独立した型に[111] [112] 、大文字小文字変換がロケール非依存に[113] 、DNF型[114] 、トレイトでの定数[115] 8.3 安定版 2023-11-23 2025-11-23[21] 2026-11-23[21] 型付きクラス定数[116] 、クラス定数への動的なアクセス構文[117] 、#[ \Override ]
アトリビュート[118] 、readonlyプロパティのclone中の再初期化[119] 、json_validate()関数[120] 、乱数生成関数[121] 、CLIで複数ファイルの文法チェックに対応
注釈 出典 関連項目 ウィキブックスに
PHP 関連の解説書・教科書があります。
外部リンク 低水準言語 高水準言語
1950年代 1960年代 1970年代 1980年代 1990年代 2000年代 2010年代
架空の言語