PHPとは、スクリプト言語の一種で、サーバーサイドで動作し、HTMLの文書内に統合される形で記述されることを特徴とするプログラミング言語のことである。動的なWebページを生成するために用いられる。
PHPのプログラムは、HTML内にPHP用の要素を示す特別のタグを設けて、その中に記述される。通常PHPプログラムを含むファイルは、拡張子に「.php」が付けられる。ファイルの実行時には、クライアントに出力される前にWebサーバー上で処理される。PHPのインタプリタは、Apacheのモジュール(mod_php5など)として組み込まれ、Apacheと一体になって実行されるため、CGIの実行によるサーバーサイドプログラムよりも高速である。PHPは、JavaやC言語、C++と類似の構文を持っている。変数定義、関数定義、クラス定義、継承、例外処理などが実行可能である。
PHPは、HTMLの中にスクリプトを埋め込む形で用いることができ、それ自体が「テンプレート」でもあるため、簡単に使うことができる。フォームデータなどのHTTP要求を簡単に解析できる仕組み、MySQLやPostgreSQLとの接続、PDFの生成など、利用頻度の高そうな機能が標準レベルで多数組み込まれている。小規模な会員データや商品データを格納するデータベースとそのデータを検索したり表示したりするWebデータベースシステムのような小規模な動的サイトであれば、PHPを用いて迅速に構築することができる。また、オブジェクト指向の機能や、アプリケーションフレームワークを活用することにより、ある程度の大規模な開発にも対応できる。このような特徴により、PHPは多くのWebアプリケーション開発者から支持を得、多くのWebサイトで採用されている。
PHPは、1995年にRasmus Lerdorfが。自分のホームページを生成するために「PHP/FI」(Personal Home Page/Forms Interpreter)と呼ばれるPerlモジュールを作成したことから始まったとされる。その後エンジン部分がC言語で書き直され、大幅に性能が向上した。1998年にPHP 3.0が発表され、機能が大幅に強化され、急速に普及した。2000年には、PHP 4.0が発表され、基本的なオブジェクト指向プログラミング機能が追加された。2004年には、オブジェクト指向機能が本格的に整備され、PHP 5.0が発表された。PHPのオブジェクト機能は、単一継承やカプセル化が利用でき、Java同様のtry catch構文による例外処理も可能となっている。なお、PHP 4.0からは、Zend社が作成したZendエンジンがコアに採用され、インタープリタの性能が大幅に改善されている。
PHPの正式名は、当初「Personal Home Page Tools」であったが、その後「PHP Hypertext Preprocessor」という再帰的頭字語が与えられた。
PHPには、PEARのライブラリ群、mojavi、Ethna、symfony、CakePHP、CodeIgniter、ZendFrameworkなどのWebアプリケーションを効率的に構築できるフレームワークや、Smartyのようなテンプレートエンジンなど多数の外部ライブラリが存在している。JavaのStrutsのようなMVCモデルや、Ruby On RailsのようなRAD(Rapid Application Development)を利用した開発が可能となっている。また、PHPには、コマンドライン版も存在しており、これによりシェル上でも実行できるため、PerlやRubyのような使い方も可能である。またWindowsやMac OSなどのUNIX以外のプラットフォームでも利用可能である。
(PHP:_Hypertext_Preprocessor から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2026/02/03 05:04 UTC 版)
| パラダイム | 命令型プログラミング、関数型プログラミング、オブジェクト指向プログラミング、手続き型プログラミング、リフレクション |
||
|---|---|---|---|
| 登場時期 | 1995年6月8日[1] | ||
| 開発者 | ラスマス・ラードフ、アンディ・ガトマンズ、PHP Group、ゼンド・テクノロジーズ、ゼーブ・スラスキー |
||
| 最新リリース | 8.5.2 / 2026年1月15日[2] | ||
| 評価版リリース |
|
||
| 型付け | 強い動的型付け | ||
| 主な処理系 | PHP, HHVM, Phalanger | ||
| 方言 | Hack | ||
| 影響を受けた言語 | Perl, C, C++, Java,[4] Tcl,[1] JavaScript[5] | ||
| 影響を与えた言語 | Hack, JSP, ASP, React JS | ||
| プラットフォーム | Unix系、Microsoft Windows |
||
| ライセンス | PHP License |
||
| ウェブサイト | |||
| 拡張子 | php、phar |
||
PHP(ピー・エイチ・ピー)は、 "The PHP Group" によってコミュニティベースで開発[6]されているオープンソースの汎用プログラミング言語およびその公式の処理系であり、特にサーバーサイドで動的なウェブページを作成するための機能を多く備えていることを特徴とする[7]。 名称の PHP は再帰的頭字語として、 "PHP: Hypertext Preprocessor" を意味[8][9]するとされており、「PHPはHTMLのプリプロセッサである」とPHP自身を再帰的に説明している。
PHPはラスマス・ラードフが個人的にCで開発していたCGIプログラムである "Personal Home Page Tools" (短縮されて "PHP Tools" と呼ばれていた)を起源とする[9]。 元々はラードフ自身のWebサイトで簡単な動的Webページを作成するために用いられていたが、その後データベースへのアクセス機能などを追加したPHP Toolsを1995年にGPLの下で公開した[10]。 オープンソースライセンスの下で公開されたことにより同ツールの利用者が増加し、機能の追加を行う開発者たちの貢献もあって、幾度かの大きなバージョンアップを経て今日に至っている。 PHPの再帰的頭字語が PHP: Hypertext Preprocessor となったのは2017年現在の文法の基礎が確立したPHP 3から[9]である。
先に述べたように、PHPは動的なWebページを生成するツールを起源としているため、公式の処理系にはWebアプリケーション開発に関する機能が豊富に組み込まれている。 元々PHPはプログラミング言語と言えるものではなく、単にテンプレート的な処理を行うだけであったが、度重なる機能追加やコードの書き直しにより、2017年現在リリースされているPHP 5やPHP 7は目的によらず汎用的に使うことの出来るスクリプト言語となっている。 特にApache HTTP ServerやnginxといったWebサーバーソフトウェアから動作させるスクリプト言語として選択されてサーバーサイドWebアプリケーション開発に利用されることが多い。
プログラミング言語としてのPHPは、CやPerl, Javaなどのプログラミング言語に強く影響を受けており、これらの言語に近く学習しやすい文法を有する。 組み込み関数についてもこれらの言語から直接輸入されたものも多く、関数名を変えずにそのまま取り込んだことで標準関数の命名規則が一貫していないといった問題も有している。 またC由来のヌル終端文字列とヌル文字を含むことを許容する文字列とが併存し、関数によってどちらを取り扱うかが異なっていたために深刻なセキュリティ上の問題を起こしたこともある[11]。
PHPで書かれたライブラリは、PEARを利用してシステムワイドにインストールしたりユーザ単位で利用することが多かったが、2012年にRubyのパッケージ管理ツールであるRubyGems及び依存関係管理ツールbundler、Node.jsのnpmに影響を受けて開発されたComposerが公開されたことにより、パッケージリポジトリPackagist[12]に登録されたライブラリをプロジェクト単位で利用することが容易になった。
PHP製のWebアプリケーションフレームワークが増加したことにより、それらが提供するロガーやHTTPリクエストハンドラなどといった共通の機能を実装するコードの再利用性を高めるため、2010年頃にフレームワーク開発者などが集まってPHP Standard Groupを立ち上げた[13]。 PHP Standard Groupはその後PHP-FIG (Framework Interoperability Group)に改称し、クラスオートローディングの規格やコーディング規約などの推奨される標準規格、PSR (PHP Standards Recommendations)の策定を行っている[14]。
プログラミング言語としてのPHPはCやPerlなどの影響を強く受けており、同じくこれらに影響を受けたRubyやPythonと比較してよりCそのままに近い制御構文を有している。 またクラスやインターフェイスといったオブジェクト指向構文はC++よりJavaに近いものが採用されている。 文法の近さによって利用者の多いCやJavaからPHPを学んだり、その逆も行いやすいことは言語の学習コストの面からは大きな利点である。
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には規格などが存在しなかった[15]ため、公式の処理系の実装およびマニュアルの記述がその代わりとなっていた。 2018年1月現在では、作業中となっているが、プログラミング言語としての仕様は処理系の実装と分かれて文書化されている[16]。
この実装は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レイヤを含む。 一部の組み込み関数はプラットフォームごとに挙動が違うため、スクリプトによっては移植作業が必要になる場合がある。
公式の処理系に対して、CやC++で記述された拡張ライブラリを提供する PECL (The PHP Extension Community Library) というプロジェクトが存在する。 基本的にPECLのライブラリは標準ではPHPに組み込まれてはいないものが多いが、PECLで開発されていたライブラリがPHPの本体に標準でバンドルされるようになったり(PDO)、逆に非推奨となった機能が本体より取り除かれ、PECLでメンテナンスが継続される(mcrypt[※ 1])こともあり、拡張機能としてはPHPの準標準と言える立ち位置にある。
PHPは数多くのDBMSを標準でサポートしている。 提供されるAPIは、ベンダ固有モジュールというDBMS毎に提供される専用モジュールによるものと、ベンダ毎の差異を吸収して一貫したインターフェイスで様々なDBMSに接続出来るデータベース抽象化レイヤとがある。 特にデータベースをより高度に抽象化して扱うライブラリなどでは、様々なDBMSに対応するためにPHP5.1で標準になったデータベース抽象化レイヤ PDO をバックエンドとして選択するものが多い。
PHPをWebサーバで動作させる方法には、実行ファイル形式 (CGI / FastCGI)、モジュール形式(mod_phpなど)がある。 どの方法を利用するか(利用出来るか)はWebサーバにより異なる。 実行ファイル形式によるCGIはほぼ全てのWebサーバに対応しているが、Apacheで動作させる場合はmod_phpとFastCGI、IIS、lighttpdやNginxで動作させる場合はFastCGIが利用可能である。
PHPに標準で実装されているWebサーバ用API (SAPI)の一覧を以下に挙げる。以前はこのほかにも存在したがPHP 7.0で削除された[17]。
とくに、HTTPリクエストの度にプロセスを起動させないインタフェース(Apacheとmod_phpの組み合わせ、またはlighttpdなどのFastCGIに対応したWebサーバ)での動作が高速である。
PHPの処理系は公式の実装を含めいくつかの異なる実装が存在する。 そのうち比較的よく知られているものについて簡単に記述する。
PHPは学習コストの低さ、記述の容易さから多くのアプリケーションが開発されている。 Wikipediaを動作させているアプリケーションであるMediaWikiもPHPによって記述されている。
本節ではPHPで書かれた代表的なアプリケーションを列挙する。
ラスマス・ラードフは自身の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月に一度アップデートが行われたあとはメンテナンスは行われなかった。
イスラエルのアンディ・ガトマンズとゼーブ・スラスキーは、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 3.0がリリースされて間もなく、ガトマンズとスラスキーはPHPのプログラミング言語を処理するコアの部分の再設計を行い、新しく作り上げた実行エンジンを彼らの名前からとって "Zend Engine" と命名した。 2000年5月、このZend Engineを使用した大幅なパフォーマンスの改善を行い、より多くのWebサーバのサポートなどの機能拡張を行った新しいバージョンである"PHP 4.0"がリリースされた。 PHP 4ではコピーレフト条項がPHPの利用拡散を妨げるという判断[18]により、ライセンスからGPLが外れてPHP LicenseおよびZend EngineのコードについてはZend Engine Licenseが適用されることになった。
PHP 4は4.0から4.4までがリリースされ、2008年8月にセキュリティ対応を含めた全ての開発が終了している。
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 5.3の次のリリースとなるべく開発されていたバージョンで、エンジンの内部処理がUTF-16に置き換えられる計画であったが、多くの問題に見舞われたことから2010年に開発が断念されている。 PHP 5.3の次のリリースはPHP 5.4へと置き換えられ[19]、また次のPHPのメジャーリリースがPHP 7とされたことでPHP 6は欠番となった。
2015年12月に内部エンジンをZend Engine 3とした"PHP 7.0"がリリースされた[20]。 Zend Engineの改善を行うPHPNG (PHP Next-Gen) プロジェクトの成果を取り入れており、データ構造の改善などにより、前バージョンのPHP 5.6と比べて25%から70%の性能改善が図られている。 また言語仕様も大きく拡張されており、引数のタイプヒンティングにスカラー型が指定できるようになる[21](タイプヒンティングは5.1で導入されたが、クラスや配列など一部の型に限られていた)他、戻り値へのタイプヒンティング[22]も導入されており、前年に発表されたHHVM用プログラミング言語Hackの影響が見受けられるものになっている。[23]
2020年11月に"PHP 8.0"がリリースされた[24]。
| 色 | 意味 | メンテナンスの状況 |
|---|---|---|
| 赤 | 旧版 | メンテナンス終了 |
| 黄 | 安定版 | セキュリティ対応のみ |
| 緑 | 安定版 | バグ修正とセキュリティ対応 |
| 青 | 開発版 | 新機能の追加 |
| Ver. | メンテナンスの状況 | リリース日時 | サポート期限[25][26] | 特記事項 | |
|---|---|---|---|---|---|
| アクティブ | セキュリティ | ||||
| 1.0 | 旧版 | 1995-06-08 | 正式名称は"Personal Home Page Tools (PHP Tools)". "PHP"という名称が使用された最初のバージョン。[9] | ||
| 2.0 | 旧版 | 1997-11-01 | 正式名称は"PHP/FI 2.0". 今日まで続くプログラミング言語としてのPHPが成立した最初のバージョン。 | ||
| 3.0 | 旧版 | 1998-06-06 | 2000-10-20[26] | このバージョンからコミュニティーベースの開発に移行した。特にアンディ・ガトマンズやゼーブ・スラスキーが基礎となる部分を大幅に書き直した。[9] | |
| 4.0 | 旧版 | 2000-05-22 | 2001-06-23[26] | Zend Engineを導入し、コードのパース部分と実行部分とが分離された。[27] | |
| 4.1 | 旧版 | 2001-12-10 | 2002-03-12[26] | スーパーグローバル変数の導入 ($_GET, $_POST, $_SESSION, etc.)[27] |
|
| 4.2 | 旧版 | 2002-04-22 | 2002-09-06[26] | register_globalsが標準で無効化された。これによりセキュリティホールの原因となりがちだった外部入力をチェック無しで直接グローバル変数に格納する処理が行われなくなった。[27] |
|
| 4.3 | 旧版 | 2002-12-27 | 2005-03-31[26] | これまで提供されていたCGI用SAPIに加えてコマンドラインインターフェイス(CLI-SAPI)が導入された。[27][28] | |
| 4.4 | 旧版 | 2005-07-11 | 2008-08-07[26] | メモリ破損の脆弱性を修正した。これによりバイナリ互換性が崩れ、PHP version 4.3.x向けにビルドされた拡張が使用出来なくなった。[29] | |
| 5.0 | 旧版 | 2004-07-13 | 2005-09-05[26] | Zend Engine 2の導入とオブジェクト指向構文の刷新。[30] | |
| 5.1 | 旧版 | 2005-11-24 | 2006-08-24[26] | 大幅なパフォーマンス改善。[30] 一貫したデータベースアクセスインターフェイスを提供するPHP Data Objects (PDO)の導入。[31] | |
| 5.2 | 旧版 | 2006-11-02 | 2011-01-06[26] | フィルター拡張を標準で有効に。JSONサポートを標準化。[30] | |
| 5.3 | 旧版 | 2009-06-30 | 2014-08-14[26] | 名前空間のサポート、 静的遅延束縛、goto演算子、クロージャ、PHPアーカイブ (phar)、循環参照に対するガベージコレクション、Windowsサポートの改善、SQLite3、MySQL関数のバックエンドライブラリをlibmysqlからmysqlndに置き換え、MIMEサポートの改善のためmime_magic拡張の代替としてfileinfo拡張を追加、i18n拡張、ereg拡張の非推奨化。 | |
| 5.4 | 旧版 | 2012-03-01 | 2015-09-03[26] | トレイトのサポート、配列の短縮記法の導入。register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister()および session_is_registered()の削除。ビルトインWebサーバ。[32] 既存の機能に対するいくつかの改善、パフォーマンスの向上とメモリの削減。 |
|
| 5.5 | 旧版 | 2013-06-20 | 2016-07-10[25] | ジェネレータおよび例外処理に於けるfinallyブロックの導入、OpCache (Zend Optimizer+に基く)のバンドル。[33] | |
| 5.6 | 旧版 | 2014-08-28 | 2017-01-19[25] | 2018-12-31[25] | 定数式、可変長引数関数、引数の展開演算子(...)、累乗演算子(**)、定数と関数に対するuse文、対話型デバッガphpdbgをSAPIモジュールとしてバンドル、その他細かな改善。[34] mysql_で始まる関数名が非推奨となる。 |
| 6.x | N/A | 破棄 | N/A | N/A | ネイティブUnicodeサポートを含むことを検討されていたが、最終的にリリースされず欠番となった。[35][36] |
| 7.0 | 旧版 | 2015-12-03[37] | 2017-12-03[25] | 2018-12-03[38] | Zend Engine 3 (パフォーマンスの改善[39]とWindowsでの64-bit整数サポート[40])、可変変数に対する構文の統一[41]、 ASTに基くコンパイル[42]、Closure::call()の追加[43]、 ビットシフト演算のプラットフォーム依存性の排除[44]、 null合体演算子??[45]、 エスケープシーケンス構文によるUnicodeコードポイント指定[46]、関数の戻り値の宣言構文[22]、スカラー型のタイプヒンティング[21]、 宇宙船演算子<=>[47]、 ジェネレータの委譲[48]、無名クラス[49]、より良い暗号論的擬似乱数生成器[50]、PHPの内部エラーを例外で置き換え[51]、複数の対象をuseする場合の短縮構文[52] バージョン5.5で非推奨となっていたMySQLの拡張機能が削除された。 |
| 7.1 | 旧版 | 2016-12-01 | 2018-12-01[25] | 2019-12-01[25] | iterable型[53]、nullable型[54]、戻り値のvoid型[55]、クラス定数の 可視性の宣言[56]、短縮リスト構文[57]、複数例外のキャッチ[58] |
| 7.2 | 旧版 | 2017-11-30 | 2019-11-30[25] | 2020-11-30[25] | オブジェクト引数と戻り値の型宣言,[59]、Sodiumがコアモジュールに[60]、抽象メソッドのオーバーライド[61]、パラメータの型の拡大変換[62]、countableでない型のオブジェクトに対するcount()で警告を発生するように[63] |
| 7.3 | 旧版 | 2018-12-06 | 2020-12-06[25] | 2021-12-06[25] | ヒアドキュメントとNowdoc構文がより柔軟に[64]、リファレンスへの分割代入のサポート[65]、PCRE2のサポート[66]、 hrtime()関数[67] |
| 7.4 | 旧版 | 2019-11-28 | 2021-11-28[25] | 2022-11-28[25] | アロー関数、型付きプロパティ[68]、OPcacheでの事前ロード[69]、Null合体代入演算子[70]、openssl_random_pseudo_bytes()の改善[71]、弱い参照[72]、FFI – Foreign function interface拡張モジュール[73]、hash拡張モジュールが常に有効に[74]、password_hash()の改善[75]、mb_str_split()の追加[76]、リファレンスへのリフレクション[77]、wddx拡張モジュールがPECLへ移動[78]、カスタムオブジェクトのシリアライズのためのマジックメソッド[79] |
| 8.0 | 旧版 | 2020-11-26 | 2022-11-26[25] | 2023-11-26[25] | JITコンパイラ[80]、負のインデックスで始まる配列[81]、トレイトでprivateな抽象メソッドを定義可能に[82]、文字列と数値の比較の改善[83]、数値を示す文字列の改善[84]、算術演算子/ビット演算子で演算不能時にTypeErrorをスローするように[85]、PHPエンジンのエラーを再分類[86]、組込関数の一貫した型エラー[87]、非互換なメソッドのシグネチャが致命的なエラーに[88])、float型から文字列型へのキャストがロケール非依存に[89]、多数の構文の調整[90]、アトリビュート[91][92][93][94]、名前付き引数[95]、match式[96]、コンストラクタ引数のプロパティ昇格機能[97]、union型[98]、mixed型[99]、戻り値としてのstatic型[100]、nullsafe演算子[101]、変数に保存せずに例外をキャッチする構文[102]、throw式[103]、JSON拡張モジュールが常に有効に[104] |
| 8.1 | 安定版 | 2021-11-25 | 2023-11-25[25] | 2025-12-31[25] | 明示的な8進数プレフィックス[105]、列挙型[106]、readonlyプロパティ[107]、第一級callable生成記法[108]、初期化時のnew式の許可[109]、交差型[110]、戻り値のnever型[111]、クラス定数のfinal指定[112]、ファイバー[113] |
| 8.2 | 安定版 | 2022-12-08 | 2024-12-31[25] | 2026-12-31[25] | Readonlyクラス[114]、null, false, trueが独立した型に[115][116]、大文字小文字変換がロケール非依存に[117]、DNF型[118]、トレイトでの定数[119] |
| 8.3 | 安定版 | 2023-11-23 | 2025-12-31[25] | 2027-12-31[25] | 型付きクラス定数[120]、クラス定数への動的なアクセス構文[121]、#[\Override]アトリビュート[122]、readonlyプロパティのclone中の再初期化[123]、json_validate()関数[124]、乱数生成関数[125]、CLIで複数ファイルの文法チェックに対応 |
| 8.4 | 安定版 | 2024-11-21 | 2026-12-31[25] | 2028-12-31[25] | プロパティフック、非対称可視性、アトリビュート、DOM 拡張モジュールの新機能と HTML5サポート、BCMathのオブジェクトAPI |
PHP is a popular general-purpose scripting language that is especially suited to web development.
—The PHP Group,php.net
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2017/02/21 17:40 UTC 版)
| このページの名前に関して「PHP (プログラミング言語)」もしくは「PHP」への改名が提案されています。 議論はこのページのノートを参照してください。(2017年2月) |
| パラダイム | 命令型, オブジェクト指向 |
|---|---|
| 登場時期 | 1995年 |
| 設計者 | ラスマス・ラードフ |
| 開発者 | The PHP Group |
| 最新リリース | 7.1.2 - 2017年2月17日[1] [+/−] |
| 評価版リリース | 7.1.0 Release Candidate 6 - 2016年11月10日 [+/−] |
| 型付け | 強い動的型付け |
| 影響を受けた言語 | C, C++, Java, Perl, Tcl |
| プラットフォーム | クロスプラットフォーム |
| ライセンス | PHP License |
| ウェブサイト | php.net |
PHP: Hypertext Preprocessor(ピー・エイチ・ピー ハイパーテキスト プリプロセッサー)とは、動的にHTMLデータを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。一般的には PHP と省略して用いられており、これは「個人的なホームページ」を意味する英語の "Personal Home Page" に由来する[2]。
PHPはサーバーサイド・スクリプト言語として利用されており、Webサーバ上で動作し、Webサーバ上でPHPスクリプトの文書が要求されるたびに、そのPHPスクリプトが実行され、結果をウェブブラウザに対して送信する。平易な文法のため初心者でも習得しやすく、また大規模な開発にも多く用いられている。多くのフレームワークやライブラリが存在し、開発の手助けとなっている。
数多くのオープンソースウェブアプリケーションに利用されている一方、しばしば脆弱性の報告がなされ、過去に深刻なセキュリティホールが何度か報告されている。
PHPのマスコットアニマルとしてはelePHPantという象が用いられる。
PHPには以下の特徴を持ち合わせている。
PHP4以降、Zend Engineをスクリプト言語を処理するエンジンとして利用している。Zend Engineは、PHP3の開発者によって設立されたZend Technologies Ltd.により開発されたオープンソースのスクリプト言語エンジンである。Zend Engineは1つのプロセスが1つのインタプリタのコンテキストを持つように設計されていて、単独ではマルチスレッドを用いた処理をサポートしていない。
スクリプト実行環境としてのPHPは、Zend Engineに加え、PHPの組み込み関数の実装、Webサーバや標準入出力とスクリプティングエンジンの間を仲介するSAPI (Server API) レイヤ、マルチスレッドで動くWebサーバのモジュールとして利用される場合にグローバル変数のセマンティクスを提供するTSRM (Thread Safe Resource Manager)、プラットフォーム間での入出力機構やAPIの差異を吸収するStreamsレイヤからできている。
しかし、一部の組み込み関数はプラットフォームごとに挙動が違うため、スクリプトによっては移植作業が必要になる場合がある。
また、.NET Framework上のPhalanger、JITコンパイルを行うHHVMなど、公式のZend Engine以外にもPHPの実装が存在する。
PHPをWebサーバで動作させる方法には、実行ファイル形式 (CGI / FastCGI)、モジュール形式(mod_php / ISAPI など)がある。どの方法を利用するか(利用できるか)はWebサーバにより異なる。実行ファイル形式によるCGIはほぼ全てのWebサーバに対応しているが、Apacheで動作させる場合はmod_phpとFastCGI、IISで動作させる場合はFastCGIとISAPI、lighttpdやNginxで動作させる場合はFastCGIが使用できる。
このほかにも、PHPに標準で実装されているWebサーバ用APIは多い。以下に一覧を挙げる。
とくに、HTTPリクエストの度にプロセスを起動させないインタフェース(Apacheとmod_phpの組み合わせ、またはlighttpdなどのFastCGIに対応したWebサーバ)での動作が高速である。
文法はC言語、Java、Perlなどのプログラミング言語から強く影響を受けている。 その開発の経緯から、PHPは非常に多くの組み込み関数を有しており、動的Webページを速やかに作成できるのが特徴である。
幾つかのサンプルコードとその実行結果を交え、PHPの文書構造を解説する。
PHPは<?phpと?>で囲まれた内部をPHPコードと認識し実行する。 ファイルの末尾が?>である場合にはこれを省略出来、また改行や空白などの混入を防ぐため省略することが推奨されている。
<?php
if ($a) {
?>
<div>HTMLコード</div>
<?php
} else {
?>
<span><?php echo "aは偽"; ?></span>
<?php
}
<?phpと?>で囲まれていない部分はプログラムとは解釈されずそのまま出力される。 PHPコード部分に文法上の問題がなければPHPはこれを実行する。 出力は以下のようになる(便宜上2通り記す)。
<div>HTMLコード</div>
<span>aは偽</span>
if、else (elseif) は条件評価の制御構造としてよく知られた構文であり、他にもPHPではfor、while (do)、foreach、switch文などの制御構造がサポートされている。 break、continue等のループ制御構造文もあるが、ループ式を命名するlabel文構造は持たない。
PHPにおいて変数は先頭に記号$の付いた文字列で表される。 PHPは比較的変数に寛容であり、変数が確保されていない場合は、これをエラーとせずにnullとして処理する(エラーレベルの設定によってはE_NOTICEレベルの警告を発生する)。
変数名は、別の変数が格納している文字列を利用することも出来る。 以下はその例である。
<?php
$a = x;
$$a = y; // $a==x なので $x = y;と等価
echo $x; // yを出力
PHPは以下の標準型をサポートする
配列を生成するにはarray()を用いるか、PHP5.4以降ならば[]を用いる。
<?php
// arrayでの生成
$a = array("wikipedia", "mediawiki", 3 => "commons");
echo $a[0]; // wikipedia
echo $a[3]; // commons
// PHP5.4以降ならこのように書ける
$a = ["wikipedia", "mediawiki", 3 => "commons"];
// 明示的な代入
$b[0] = "wikipedia";
$b[] = "mediawiki"; // []の中身を省略すると
$b[] = "commons"; // 定義済みの最大の整数インデックス + 1の要素に代入する
echo $b[2]; // commons
PHPでは通常、グローバル変数を利用するには明示的にglobal宣言をする必要があるが、スーパーグローバル変数として標準で定義されているいくつかの変数はglobal宣言なしで利用出来る。
以下のグーパーグローバル変数はPHP4.1以降で利用可能である。 PHP4.0以前では括弧内のグローバル変数(スーパーグローバルではない)を用いてアクセスする必要があった。 これら括弧内の変数はPHP4.1で非推奨となり、PHP5.4で削除された。
全容把握には、var_dump等で参照するとよい。
<?php
var_dump($_SERVER);
PHPはクラスベースのオブジェクト指向構文をサポートしている。 以下に例を挙げる。
<?php
// クラスの定義
class abc
{
public $a = null;
public function b()
{
echo "Class abc, Method b", PHP_EOL;
return "abc->b";
}
public function __construct()
{
echo "abc: constructor", PHP_EOL;
}
}
// クラスabcを継承したクラスdefを定義
class def extends abc
{
public function __construct()
{
parent::__construct(); // 親クラスのコンストラクタを呼ぶ
echo "def: constructor", PHP_EOL;
}
// 親クラスのメソッドbをオーバーライドする
public function b()
{
echo "Class def, Method b", PHP_EOL;
}
public function c()
{
parent::b();
}
}
$c = new abc();
$c->b();
$f = new def();
$f->b();
PHPではnewキーワードを使ってクラスをインスタンス化することが出来る。 クラスの継承はextendsキーワードを用いることで単一継承のみ可能で、多重継承はサポートされていない。 クラスのプロパティやメソッドの宣言および定義ではprivate/protected/publicの3種類の可視性が指定出来る(PHP4ではプロパティの宣言でvarキーワードが使われており、秘匿することが出来なかった)。
parentキーワードはサブクラスが継承したスーパークラスを表しており、サブクラスでメソッドをオーバーライドしたとき、スーパークラスの同名メソッドを呼ぶ場合などに用いることが出来る。 上記の例では、クラスdefのスーパークラスabcのメソッドbはオーバーライドされており、スーパークラスの同名メソッドをparent::b()で呼び出している。 実行結果は次のようになる。
abc: constructor Class abc, Method b abc: constructor def: constructor Class def, Method b Class abc, Method b
private/protected/publicおよびfinalの各キーワードはPHP5で導入された。 メソッドに対してfinalキーワードを用いると子クラスでのオーバーライドを禁止することが出来る。 クラスに対して適用すればクラスの継承が禁止される。
またstaticキーワードを用いることで、クラスのインスタンス化を行わなくてもアクセス可能なプロパティやメソッドを定義出来る。
class abc
{
// インスタンス化しなくてもアクセス出来るメソッド
public static function b()
{
}
}
abc::b(); // アクセスするには クラス名::メソッド() という構文を用いる
PHP5以降では、クラスの抽象化およびインタフェースが導入された。 これらの構文はJavaやObjective-Cなどに近い構文をとる。
まず最初に具体的なソースコードを示す。
<?php
// インタフェースの定義
// メソッドは実装を持たない
interface classTemplates
{
public function methodA($arg1, $arg2);
public function methodB($arg1);
}
// インタフェースを実装したクラスの定義
// インタフェースに宣言されたすべてのメソッドを実装しなければならない
class appTemplate implements classTemplates
{
public function methodA($arg1, $arg2)
{
}
public function methodB($arg1)
{
}
}
インタフェースを定義するにはclassキーワードの代わりにinterfaceキーワードを用いる。 インタフェースの定義では可視性がpublicあるいはprotectedなものだけを宣言し、メソッドには実装を書いてはならない。 これは、インタフェースがクラスの利用者からその具体的な実装を隠匿(クラスの抽象化)し、どのようなメソッド(API)を持つかだけを宣言するものであることによる(privateはそもそも外部から見えない)。
クラスの宣言においてimplementsキーワードを用いてインタフェースを指定することで、そのクラスにインタフェースで宣言したメソッドを全て実装することを明示することが出来る。
クラスと同様、インタフェースもextendsキーワードで継承を行うことが出来る。
<?php
interface classTemplatesModel
{
public function methodAlpha($arg1, $arg2);
public function methodBeta($arg1);
}
interface classTemplates extends classTemplatesModel
{
public function methodGamma();
}
クラスと異なり、インタフェースには実装が伴わないことから多重継承が可能である。 複数のインタフェースを実装するにはimplementsキーワードにカンマ区切りで複数のインタフェースを指定する。
<?php
interface classTemplatesModel
{
public function methodAlpha($arg1, $arg2);
public function methodBeta($arg1);
}
interface classTemplates
{
public function methodGamma();
}
class appTemplate implements classTemplates, classTemplatesModel
{
public function methodAlpha($arg1, $arg2)
{
}
public function methodBeta($arg1)
{
}
public function methodGamma()
{
}
}
クラスの定義においてabstractキーワードを用いることで抽象クラスを定義出来る。 抽象クラスは通常の実装を持つメソッドと(やはりabstractキーワードを付けた)実装を持たないメソッド(抽象メソッド)が混在することが許されたクラスであり、インスタンス化することは出来ない。
抽象クラスは継承されるために作成され、サブクラスが抽象クラスでない限りすべての抽象メソッドがサブクラスで実装される必要がある。
<?php
abstract class Alpha
{
abstract public function methodAlpha($arg1, $arg2);
protected function methodBeta($arg1)
{
echo "Alpha クラスで実装されたmathodBeta メソッド¥n";
}
public function __destruct()
{
echo "インスタンスを破棄、メモリを開放[Alpha::destruct]¥n";
}
}
class Beta extends Alpha
{
public function __construct()
{
$this->methodAlpha("","");
$this->methodBeta("");
}
public function methodAlpha($arg1, $arg2)
{
echo "Beta クラスで実装されたmethodAlpha メソッド¥n";
}
}
new Beta();
Beta クラスで実装された methodAlpha メソッド Alpha クラスで実装された methodBeta メソッド インスタンスを破棄、メモリを開放 [Alpha::destruct]
PHPではMySQLやPostgreSQLなど主要なRDBMSへの接続については、それぞれ専用の組み込み関数が用意されている。 しかし専用の組み込み関数を利用すると複数のデータベースへの対応やデータベースの切り替えに際して大きな移行コストが必要となる。
そのコストを低減するため、PHP5よりPHP Data Object (PDO)と呼ばれる薄いデータベース抽象化レイヤが標準で提供されている。 PDOは薄いレイヤであり、データベースへの接続を抽象化し高速に動作する代わりに、SQLビルダなどの機能は提供していない。
include、require等の演算子で外部ファイルに記述されたPHPコードを追加ないし、参照、実行が可能である。returnは戻り値を返す文書構造である。return()とすることで戻り値を評価することも可能である。
Unixコマンドを実行可能であるが、CGIより実行権限は低くなっている。また一部関数はこのUnixコマンドを参照するため、Windows系OSでは使用できない関数がある。コマンドを参照する関数を使用する際は、サーバの設定でパスが通っている必要がある。
幾つもの拡張により扱える関数は環境に依りまちまちである。詳しくは外部リンクのリファレンスを参照されたい。
複数のPHPプロジェクト参加者からなる団体のPHP-FIGにより、PSRと呼ばれる相互運用性を高める規約が制定されている。ファイル名や一般的なコーディング規約だけでなく、クラスのオートロード方法等の実装部分にまで及んでおり、PSR-1、PSR-2等と複数の分野に分かれて制定されている[3]。
1995年6月8日にリリース。ラスマス・ラードフが開発。C言語で書かれた CGI 用のツール集だった。ラスマスはそれらのツール群を PHP (Personal Home Page Tools) と名づけた。初期は Perl で書かれていたという言説を見かけるが、それは誤り。[4]
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 Engine 導入。
2001年12月10日にリリース。スーパーグローバルが追加される。
2002年4月22日にリリース。register_globals の初期値が Off に変更される。
2002年12月27日にリリース。コマンドラインインタフェースの実装。
2005年7月11日にリリース。
2007年7月11日、PHP4のサポートを2007年12月31日をもって終了するという告知がなされた。重大なセキュリティに関する修正のみ、2008年8月8日まで継続され、その後すべてのサポートは終了した。
2004年7月13日にリリース。擬似的なオブジェクト指向がより一層強化されると共に、クラスライブラリとして SPL がサポートされた。 また、SQLite が標準装備されるようになった。Zend Engine 2.0 導入。
2005年11月24日にリリース。実行速度の改善、PDO エクステンションが追加される。
2006年11月2日にリリース。拡張モジュールに Filter(フィルタ)がデフォルトで追加される。
2009年6月30日にリリース。 以下の機能が追加になった[5]。
2012年3月1日にリリース。 以下の機能が追加になった[6]。
2013年6月20日にリリース。 以下の機能が追加になった[7]。
2014年8月28日にリリース。主な新機能は以下の通り[8]。
PHP 5.3の次のリリースとなるべく開発されていたバージョン。エンジンの内部処理がUTF-16に置き換えられる計画であったが、多くの問題に見舞われたことから2010年に開発を断念。5.4へと置き換えられた[9]。また5.6の次のバージョンが7とされたことから、欠番となった。
2015年12月3日にリリースされた[10]。Zend Engineの改善を行うPHPNG (PHP Next-Gen) プロジェクトの成果を取り入れており、データ構造の改善などにより、前バージョンのPHP 5.6と比べて25%から70%の性能改善が図られている。また言語仕様も大きく拡張されており、引数のタイプヒンティングにスカラー型が指定できるようになる(タイプヒンティングは5.1で導入されたが、クラスや配列など一部の型に限られていた)他、戻り値へのタイプヒンティングも導入されており、前年に発表されたHHVM用プログラミング言語Hackの影響が見受けられるものになっている。[11]
2016年12月1日にリリースされた。型指定でスカラー型とNULLを許容するNULL許容型の追加、メソッドの返り値が無いことを示すvoidリターンタイプ、例外処理を書く際に一つのブロックで複数の例外タイプをキャッチするマルチキャッチなど、型を意識したコードを実装しやすくするための拡張が行われている[12]。
Windows環境でApacheと組み合わせる場合、Windows版PHPやApacheの開発環境であるMicrosoft Visual C++のバージョンの関係から、ApacheのモジュールはApache公式サイトではなく、「Apache Lounge」なるサイトにあるものを使うように、PHPの公式サイトに記載されている。
|
|||||||||||||||||||
|
||||||||||||||||||||||
|
||||||||||||||||||||||
|
||||||||||||||||||