PHPは、 Web開発を目的とした汎用スクリプト言語です。[ 11 ] 1993年にデンマーク系カナダ人のプログラマー、ラスマス・ラードルフによって作成され、1995年にリリースされました。 [ 12 ] [ 13 ] PHPのリファレンス実装は現在、PHPグループによって作成されています。[ 14 ] PHPは元々 Personal Home Pageの略でしたが、現在は再帰的バクロニムPHP: Hypertext Preprocessorの略となっています。[ 15 ] : 14
PHPコードは通常、モジュール、デーモン、またはCommon Gateway Interface (CGI)実行ファイルとして実装されたPHPインタープリタによってWebサーバー上で処理されます。Webサーバー上では、解釈および実行されたPHPコードの結果(生成されたHTMLやバイナリ画像データなど、あらゆる種類のデータ)がHTTPレスポンスの全体または一部を構成することがあります。このレスポンスの生成を調整または促進するために使用できるさまざまなWebテンプレートシステム、Webコンテンツ管理システム、およびWebフレームワークが存在します。PHPはWebコンテキスト以外のプログラミングタスクにも使用できますが、Web以外の用途はまれです。PHPコードはコマンドラインから直接実行することもできます。
Zend Engineを搭載した標準PHPインタープリタは、PHPライセンスの下でリリースされたフリーソフトウェアです。PHPは広く移植されており、さまざまなオペレーティングシステムやプラットフォーム上のほとんどのWebサーバーにデプロイできます。
PHP言語は当初、正式な仕様書や標準規格がないまま発展し、最初の実装が事実上の標準として機能し、他の実装はそれに倣うことを目指した。
PHP の開発は 1993 年に始まりました[ 12 ]。ラスマス・ラードルフがC 言語でいくつかのCommon Gateway Interface (CGI) プログラムを作成し[ 16 ] [ 17 ] 、それを使って自分のホームページを管理していました。彼はそれらを拡張してHTML フォームを操作したり、データベースと通信したりできるようにし、この実装を「Personal Home Page/Forms Interpreter」または PHP/FI と呼びました。
<!--include /text/header.html--><!--getenv HTTP_USER_AGENT--> <!--if substr $exec_result Mozilla--> おい、君はNetscapeを使っているぞ!< p > <!--endif--><!--sql database select * from table where user='$username'--> <!--ifless $numentries 1--> 申し訳ありませんが、そのレコードは存在しません< p > <!--endif exit--> ようこそ<!--$user--> ! < p >アカウントに は<!--$index:0-->クレジットが残っています。 < p ><!--include /text/footer.html-->PHP/FI は、シンプルで動的な Web アプリケーションを構築するために使用できました。バグ報告を迅速化し、コードを改善するために、Lerdorf は当初、1995 年 6 月 8 日にUsenetディスカッション グループcomp.infosystems.www.authoring.cgiで PHP/FI を「Personal Home Page Tools (PHP Tools) バージョン 1.0」としてリリースすることを発表しました。 [ 1 ] [ 19 ]このリリースには、Perl のような変数、フォーム処理、HTML の埋め込み機能などの基本的な機能が含まれていました。この時点で構文はPerlに似るように変更されましたが、よりシンプルで、より制限があり、一貫性がありませんでした。[ 20 ] [ 14 ]
初期の PHP は新しいプログラミング言語として意図されたものではなく、むしろ有機的に成長したもので、ラードルフは後になって次のように述べている。「どうやって止めればいいのか分からない[...]プログラミング言語を書こうという意図は全くなかった[...]プログラミング言語の書き方なんて全く分からない[...]ただ、その過程で次の論理的なステップを追加し続けただけだ。」[ 21 ]開発チームが結成され、数ヶ月の作業とベータテストを経て、1997 年 11 月に PHP/FI 2 が正式にリリースされた。[ 22 ]
PHP は元々設計されたものではなく、自然発生的に開発されたため、関数の命名規則やパラメータの順序に一貫性がなくなってしまった。[ 23 ]場合によっては、PHP が「ラップ」していた下位レベルのライブラリに合わせて関数名が選ばれたが、[ 24 ] PHP のごく初期のバージョンでは、関数名の長さが内部的にハッシュ関数として使用されていたため、ハッシュ値の分布を改善するために名前が選ばれた。[ 25 ]
Zeev SuraskiとAndi Gutmans は1997 年にパーサーを書き直し、PHP 3 のベースを作り 、言語名を再帰的頭字語PHP: Hypertext Preprocessorに変更しました。[ 14 ] [ 26 ]その後、PHP 3 の公開テストが開始され、1998 年 6 月に正式にリリースされました。Suraski と Gutmans は、PHP のコアの新たな書き直しを開始し、1999 年にZend Engineを作成しました。 [ 27 ]また、イスラエルのラマト ガンにZend Technologies を設立しました。[ 14 ]
2000 年 5 月 22 日に、Zend Engine 1.0 を搭載した PHP 4.0 がリリースされました。[ 14 ] 2008 年 8 月までに、このブランチはバージョン 4.4.9 に達しました。PHP 4 は現在開発されておらず、セキュリティ アップデートのリリースも予定されていません。[ 28 ] [ 29 ]
2004年7月1日、新しいZend Engine 2.0を搭載したPHP 5.0がリリースされました。[ 14 ] PHP 5.0には、オブジェクト指向プログラミング のアプローチの大幅な変更、イテレータ、例外処理など、言語に対する重要な変更が含まれています。[ 30 ]
PHP 5.1とPHP 5.2は翌年にリリースされ、PHPデータオブジェクト(PDO)拡張機能(データベースにアクセスするための軽量で一貫性のあるインターフェースを定義する)などの小規模な改善と新機能が追加されました。2008年には、PHP 5.xが開発中の唯一の安定版となりました。
PHP 4 から PHP 5への移行を推進する PHP 開発者のコンソーシアムが提供する GoPHP5 イニシアチブ[ 31 ] により、多くの著名なオープンソースプロジェクトは2008 年 2 月 5 日以降、新しいコードでの PHP 4のサポートを終了しました。 [ 32 ] [ 33 ]
PHP のネイティブ文字列関数は生のバイト列のみで動作するため、マルチバイト文字エンコーディングの使用は困難でした。[ 34 ] [ 35 ] 2005 年、Andrei Zmievski が主導するプロジェクトが開始され、 International Components for Unicode ( ICU) ライブラリを組み込み、テキスト文字列を内部的にUTF-16として表現することで、PHP 全体にネイティブ Unicode サポートを導入しました。 [ 36 ]これは言語の内部とユーザー コードの両方に大きな変更をもたらすため、当時開発中だった他の主要な機能とともに、言語のバージョン 6.0 としてリリースされる予定でした。[ 37 ]
しかし、必要な変更を理解している開発者の不足と、Web コンテキストではほとんど使用されない UTF-16 との変換から生じるパフォーマンスの問題により、プロジェクトは遅延しました。[ 38 ]その結果、 2009 年に PHP 5.3 リリースが作成され、2010 年 3 月に、現在の形でのプロジェクトは正式に放棄され、 PHP 6 の残りの非 Unicode 機能のほとんどを含む PHP 5.4 リリースが準備されました。[ 39 ]当初は、Unicode 統合のための新しい計画が策定されることが期待されていましたが、2014 年までに採用されたものはありませんでした。
PHP 5.3は、元々6.0の一部となる予定だった機能が含まれていたため、名前空間、クロージャ、遅延静的バインディングのサポートを追加し、標準関数の多くの修正と改善を行った重要なリリースでした。[ 40 ] [ 41 ]
Unicode ブランチが正式に廃止されたため、2011 年に新しいリリース プロセスが採用され、年間リリース サイクルと、「機能リリース」(xyz から x.y+1.z)と「メジャー リリース」(xyz から x+1.0.0)の明確な区別が計画されました。[ 42 ] 6.0 リリース用に計画されていた残りの機能は、2012 年 3 月にリリースされた PHP 5.4 に含まれており、特性サポートや新しい「短い配列構文」などが含まれています。これに続いて、PHP 5.5(2013 年 6 月)と 5.6(2014 年 8 月)でさらに段階的な変更が行われました。
PHP バージョン 5.3 および 5.4 では、利用可能なMicrosoft Windowsバイナリ配布は 32 ビットIA-32ビルドのみであり、[ 43 ] [ 44 ] 64 ビット Windows プラットフォームでInternet Information Services (IIS)を使用する場合は、Windows 32 ビット互換モードが必要でした。PHP バージョン 5.5 では、Microsoft Windows 用の 64 ビットx86-64ビルドが利用可能になりました。[ 45 ]
PHP 5.6 の公式セキュリティサポートは 2018 年 12 月 31 日に終了しました。[ 46 ]
2014年から2015年にかけて、PHP 7.0 という新しいメジャー PHP バージョンが開発されました 。このバージョンの番号付けについては、社内開発者の間で議論がありました。[ 47 ] PHP 6 の Unicode 実験はリリースされませんでしたが、いくつかの記事や書籍のタイトルで PHP 6 という名前が参照されており、新しいリリースでその名前が再利用されると混乱を招く可能性がありました。[ 48 ]投票の結果、PHP 7 という名前が選ばれました。[ 49 ]
PHP 7.0 の基盤は、当初PHP next generation ( phpng ) と呼ばれていたPHPブランチでした。これは Dmitry Stogov、Xinchen Hui、Nikita Popov によって作成され[ 50 ]、ほぼ完全な言語互換性を維持しながら Zend Engine をリファクタリングすることで PHP のパフォーマンスを最適化することを目的としていました。[ 51 ] 2014 年 7 月 14 日までに、 phpng プロジェクトの主要なベンチマーク スイートとして機能したWordPressベースのベンチマークでは、パフォーマンスがほぼ 100% 向上したことが示されました。phpng からの変更により、よりコンパクトなデータ構造やその他の変更が、ジャストインタイム(JIT) コンパイラへの移行に適しているとみなされているため、将来のバージョンでのパフォーマンスの向上が容易になります。[ 52 ]大幅な変更があったため、再設計された Zend Engine はZend Engine 3と呼ばれ、PHP 5.xで使用されていた Zend Engine 2 の後継となりました。 [ 53 ]
PHP 7.0 には、 2011 年に合意されたバージョン管理スキームで「メジャー バージョン」として認められている、後方互換性のない変更も含まれていました。[ 42 ]コア言語の変更には、変数の逆参照のより一貫した処理、[ 54 ]foreachステートメントのより予測可能な動作、[ 55 ]ビットシフトのプラットフォームの一貫性[ 56 ]および浮動小数点から整数への変換 [56] が含まれていました。[ 57 ]メンテナンスされていない、または非推奨のサーバー アプリケーション プログラミング インターフェイス(SAPI) と拡張機能のいくつかがPHP コアから削除されました。最も注目すべきは legacy拡張機能です。[ 58 ] ASP スタイルの区切り文字やなど、他のレガシー機能も削除されました。[ 59 ]mysql<%%><script language="php"> ... </script>
PHP 7.0 は PHP の型システムの拡張の始まりを示しました。PHP 5.x では関数パラメータのみが型宣言を持つことができましたが、これは 7.0 で関数の戻り値の型に拡張されました。[ 60 ]また、7.4 ではオブジェクトのプロパティにも拡張されました。 [ 61 ]表現可能な型も拡張され、7.0 ではスカラー型 (整数、浮動小数点数、文字列、ブール値) が追加されました。 [ 62 ]iterable 7.1 では型、[ 63 ] null 許容型、[ 64 ]およびvoid戻り値の型[ 65 ]が追加され、object7.2 では型が追加されました。[ 66 ]
この期間に行われたその他の変更は、言語の表現力を高めることを目的としており、例えば、7.0 の??( null 合体) [ 67 ] および<=>"spaceship" 3 方向比較演算子[ 68 ] 、PHP 7.1 の配列逆参照[ 69 ]および複数の例外タイプのキャッチ[ 70 ]のための新しい構文、7.3 のより柔軟なHeredocおよび Nowdoc 構文[ 71 ]、7.4 の null 合体代入演算子[ 72 ]などがある。
PHP 8.0 は、以前のバージョンとの互換性のない変更 を含むメジャーバージョンとして、2020 年 11 月 26 日にリリースされました。 [ 73 ] [ 74 ]
最も注目すべき変更点の1つは、 JITコンパイラの追加であり、これにより一部のユースケースで大幅なパフォーマンス向上を実現できます。[ 75 ] [ 76 ]大幅な改善は、一般的なWeb開発のユースケースよりも、数学的な演算においてより期待されていました。[ 77 ]さらに、JITコンパイラのパフォーマンス上の利点により、一部のコードをCからPHPに移行できる可能性があります。[ 78 ]
8.0 で言語に追加された重要な機能は属性で、クラス、メソッド、パラメータなどのプログラム要素にメタデータを追加できます。[ 73 ]後のバージョンでは、PHP 8.2 の属性、[ 79 ] PHP 8.3 の属性、[ 80 ] PHP 8.4 の属性、[ 81 ] PHP 8.5 の属性や属性など、言語の動作を変更する組み込み属性が追加されました。[ 82 ] [ 83 ] [ 84 ]#[\SensitiveParameter]#[\Override]#[\Deprecated]#[\NoDiscard]#[\DelayedTargetValidation]
言語の型システムの重要な拡張は、複合型の追加です。PHP 8.0 の共用型 (たとえば、「整数または文字列のいずれか」を意味します)、[ 85 ] PHP 8.1 の交差型 (たとえば、値がとインターフェースの両方を実装する必要があることを意味します)、[ 86 ] PHP 8.2 の選言正規形(DNF) 型 (交差の共用体、たとえば)。[ 87 ] PHP 8.0 のや などの追加の特殊型キーワード、 [ 73 ] PHP 8.1 の(関数が決して返さないことを示すボトム型)、 [ 88 ] PHP 8.2 の、、およびスタンドアロン型として が追加されました。[ 89 ] [ 90 ]int|stringTraversable&CountableTraversableCountablearray|(Traversable&Countable)mixedstaticnevernullfalsetrue
豊富な型システムの追加は、より厳密な言語への一般的な傾向の一部であり、PHP 8.0 では、文字列と数値の比較の処理[ 91 ]、数値文字列[ 92 ] 、および互換性のないメソッド シグネチャ[ 93 ]に関する破壊的変更が含まれていました。後のバージョンでは、 nullnull を許容しない内部関数パラメータへの受け渡し[ 94 ]や、クラスで宣言されていないプロパティの参照[ 95 ]など、将来のメジャー バージョンで破壊的変更として計画されている動作に対する非推奨通知が導入されています。
2011 年 6 月 28 日以降、PHP 開発チームは PHP の新バージョンのリリースに関するタイムラインを導入しました。[ 42 ]このシステムでは、毎月少なくとも 1 つのリリースが行われる必要があります。年に 1 回、新機能を含む可能性のあるマイナー リリースが行われる必要があります。すべてのマイナー リリースは、セキュリティとバグ修正で少なくとも 2 年間サポートされ、その後、セキュリティ修正のみで少なくとも 1 年間サポートされるため、すべてのマイナー リリースで合計 3 年間のリリース プロセスとなります。3 年間のリリース プロセス中に、小規模で自己完結型の機能を除き、新機能をマイナー リリースに導入することはできません。2024 年の RFC では、セキュリティ修正のみの期間が 2 年間に延長され、すべてのサポート終了日が 12 月 31 日に固定され、「小規模で自己完結型の」機能をパッチ バージョンに導入できる例外が削除されました。[ 193 ]
W3Techsは、2025年11月時点で ( PHP 7 のサポート終了から約 3 年 、PHP 8.3 リリースから 23 か月が経過した現在でも)PHP 7 などのサポート対象外バージョンが、 PHP Web サイトの半数以上で使用されており、これらは時代遅れでセキュリティ上の問題があることが知られています。[ 194 ] [ 195 ]これには、20 年以上前にリリースされた、さらに時代遅れでセキュリティ上の問題がある PHP 5 を使用している PHP Web サイトの 9.7% も含まれます 。

PHPプロジェクトのマスコットは、1998年にヴィンセント・ポンティエ[ 196 ]によってデザインされた、側面にPHPロゴが描かれた青い象のelePHPantです。 [ 197 ]「(PHP)の文字は、横から見ると象の形を成していました。」[ 198 ]
elePHPantはぬいぐるみになると色が変わることがある。[ 199 ]このマスコットの様々なバリエーションが長年にわたって作られてきた。コミュニティでは、Vincent Pontierによるオリジナルデザインに基づいたelePHPantのみが公式とみなされている。[ 200 ]これらは収集品であり、中には非常に希少なものもある。[ 201 ]

以下の「Hello, World!」プログラムは、 HTMLドキュメントに埋め込まれたPHPコードで記述されています。
< ! DOCTYPE html > <html> <head> <title> PHP " Hello , World ! "プログラム</title> </head> <body> <p> < ? = ' Hello , World ! ' ? > </p> </body> </html>PHP インタープリタは、区切り文字内の PHP コードのみを実行します。区切り文字の外側にあるものは PHP によって処理されませんが、PHP コードで記述された制御構造<?phpは、PHP 以外のテキストにも適用できます。 は、PHP セクションの開始と?>終了に使用されます。 の短縮形<?=である が存在します。[ 15 ] : 22–23、46短縮形も存在しますが、ローカル PHP 構成でサポートを無効にできるため、スクリプト ファイルの移植性が低下します。このため、PHP グループでは短縮形の使用を推奨していません。[ 202 ] [ 203 ]一方、echo 短縮タグ の使用を推奨していません。[ 204 ] PHP 5.4.0 より前では、 の短縮構文は構成設定が有効になっている場合にのみ機能しますが、PHP 5.4.0 以降では常に使用できます。[ 205 ] [ 206 ] [ 202 ]区切り文字の目的は、PHP コードをJavaScriptコードや HTML マークアップなどの非 PHP コンテンツから分離することです。 [ 207 ]<?phpecho<?<?= echoshort_open_tag
XHTMLやその他のXML文書における最初の形式の区切り文字、<?phpおよびは、正しく構成された XML 処理命令を作成します。 [ 208 ]これは、結果として得られるサーバー側ファイル内の PHP コードとその他のマークアップの組み合わせ自体が、整形式の XML であることを意味します。?>
変数にはドル記号が接頭辞として付き、型を事前に指定する必要はありません。PHP 5 では、関数がパラメータを特定のクラスのオブジェクト、配列、インターフェース、またはコールバック関数に強制できる型宣言が導入されました。ただし、PHP 7 より前は、型宣言は整数や文字列などのスカラー型には使用できませんでした。[ 62 ]
以下は、PHP変数の宣言と初期化の例です。
<?php $name = 'John' ; // 文字列型の変数を宣言および初期化$age = 18 ; // 整数型の変数を宣言および初期化$height = 5.3 ; // 倍精度浮動小数点型の変数を宣言および初期化echo $name . ' は ' . $height . "m の身長です\n " ; // 変数と文字列を連結echo " $nameは$age歳です。" ; // 変数を文字列に補間?>関数名やクラス名とは異なり、変数名は大文字と小文字を区別します。二重引用符("")とヒアドキュメント文字列の両方で、変数の値を文字列に挿入できます。[ 209 ] PHPは自由形式言語のように改行を空白として扱い、文はセミコロンで終了します。[ 210 ] PHPには3種類のコメントがあります。ブロックコメントとインラインコメントをマークし、または1行コメントに使用されます。ステートメントは、PHPがテキストを出力するために提供するいくつかのキーワードの1つです。[ 15 ] : 24–26/* *///#echo
キーワードと言語構文に関しては、PHP は C スタイルの構文に似ています。if条件、forループwhile、関数の戻り値は、C、C++、C#、Java、Perl などの言語と構文が似ています。[ 211 ] [ 212 ] [ 213 ]
PHP は緩やかな型付け言語です。整数はプラットフォーム依存の範囲で格納され、 C 言語の long 型に相当する32、64、または 128 ビットの符号付き整数として格納されます。符号なし整数は特定の状況で符号付き値に変換されますが、これは他の多くのプログラミング言語とは異なる動作です。[ 214 ]整数変数は、10 進数 (正と負)、 8 進数、16 進数、および2 進数の表記を使用して代入できます。 [ 215 ]
浮動小数点数もプラットフォーム固有の範囲に格納されます。浮動小数点表記法、または2種類の科学的表記法を使用して指定できます。[ 216 ] PHPには、JavaやC++のネイティブブール型に似たネイティブブール型があります。PerlやC++と同様に、ブール型の変換ルールを使用すると、ゼロ以外の値はtrue、ゼロはfalseとして解釈されます。[ 216 ]
nullデータ型は値を持たない変数を表します。NULLこのデータ型で許容される値はnullのみです。[ 216 ]
「リソース」型の変数は、外部ソースからのリソースへの参照を表します。これらは通常、特定の拡張機能の関数によって作成され、同じ拡張機能の関数によってのみ処理できます。例としては、ファイル、画像、データベースのリソースなどがあります。[ 216 ]
配列には、PHP が処理できるあらゆる型の要素を含めることができます。これには、リソース、オブジェクト、さらには他の配列も含まれます。値のリストとキーと値の両方を含むハッシュでは順序が保持され、両者を混在させることもできます。[ 216 ] PHP は文字列もサポートしており、文字列はシングルクォート、ダブルクォート、nowdoc またはheredoc構文で使用できます。[ 217 ]
標準PHPライブラリ(SPL)は、標準的な問題を解決し、効率的なデータアクセスインターフェースとクラスを実装しようと試みています。[ 218 ]
PHP はコア言語で多数の関数を定義しており、その多くはさまざまな拡張機能でも利用できます。これらの関数は、オンラインの PHP ドキュメントで十分に文書化されています。[ 219 ]ただし、組み込みライブラリには、上記の履歴で説明したように、さまざまな命名規則とそれに伴う矛盾があります。
開発者はカスタム関数を定義できます。
function myAge ( int $birthYear ) : string { // 現在の年から生まれた年を引いて年齢を計算します。$yearsOld = date ( 'Y' ) - $birthYear ;// 年齢を分かりやすい文字列で返します。return $yearsOld . ( $yearsOld == 1 ? ' 年' : ' 年' ); }echo '私は現在' . myAge ( 1995 ) . '歳です。' ;2026年現在、上記のサンプルプログラムの出力は「私は現在31歳です」です。
PHP では、関数ポインタの代わりに、関数名を含む文字列で関数を参照できます。このようにして、通常の PHP 関数を、たとえばコールバックとして、または関数テーブル内で使用できます。[ 220 ]ユーザー定義関数は、プロトタイプなしでいつでも作成できます。[ 219 ] [ 220 ]関数はコードブロック内で定義でき、実行時に関数を定義するかどうかを決定できます。指定された名前の関数が既に定義されているかどうかを判断する関数があります。関数呼び出しには括弧を使用する必要がありますが、 PHP 演算子で呼び出されるfunction_exists引数なしのクラスコンストラクタnew関数は例外で、括弧は省略可能です。
PHP 4.0.1以降create_function()、 の薄いラッパーによりeval()、プログラム実行中に通常の PHP 関数を作成できるようになりました。これは PHP 7.2 で非推奨となり、PHP 8.0 [ 221 ]で削除され、PHP 5.3 で追加された、周囲のスコープから変数をキャプチャできる匿名関数または「クロージャ」[ 222 ]の構文が優先されました。PHP 7.4 では、ショートカット矢印構文が追加されました。[ 223 ]
function getAdder ( $x ) { return fn ( $y ) => $x + $y ; }$adder = getAdder ( 8 ); echo $adder ( 2 ); // "10"と出力されます上記の例では、getAdder()関数は渡された引数を使用してクロージャを作成します。$xこの引数は追加の引数を受け取り$y、作成されたクロージャを呼び出し元に返します。このような関数は第一級オブジェクトであり、変数に格納したり、他の関数のパラメータとして渡したりすることができます。 [ 224 ]
動的型付け言語としては珍しく、PHP は関数パラメータの型宣言をサポートしており、実行時に強制されます。これは、PHP 5.0 以降ではクラスとインターフェース、PHP 5.1 以降では配列、PHP 5.4 以降では「呼び出し可能オブジェクト」 、PHP 7.0 以降ではスカラー型 (整数、浮動小数点数、文字列、ブール値) でサポートされています 。[ 62 ] PHP 7.0 では、関数の戻り値の型宣言も可能で、パラメータのリストの後にコロンを付けて型名を記述します。[ 60 ]例えば、getAdder前述の例の関数は、PHP 7 では次のように型注釈を付けることができます。
function getAdder ( int $x ) : Closure { return fn ( int $y ) : int => $x + $y ; }$adder = getAdder ( 8 ); echo $adder ( 2 ); // "10" と出力されますecho $adder ( null ); // 型が間違って渡されたため例外が発生します$adder = getAdder ([]); // これも例外が発生しますデフォルトでは、スカラー型の宣言は弱い型付けの原則に従います。したがって、たとえば、パラメータの型が の場合int、PHP は整数だけでなく、変換可能な数値文字列、浮動小数点数、またはブール値もその関数に渡すことを許可し、それらを変換します。[ 62 ]ただし、PHP 7 には「厳密な型付け」モードがあり、これを使用すると、ファイル内の関数呼び出しと戻り値に対してそのような変換が許可されなくなります。[ 62 ]
基本的なオブジェクト指向プログラミング機能は PHP 3 で追加され 、PHP 4で改良されました。 [ 14 ]これにより PHP はさらなる抽象化を獲得し、この言語を使用するプログラマーにとって創造的なタスクが容易になりました。オブジェクト処理は PHP 5 で完全に書き直され、機能セットが拡張され、パフォーマンスが向上しました。[ 225 ]以前のバージョンの PHP では、オブジェクトは値型のように扱われていました。[ 225 ]この方法の欠点は、コードが渡されたオブジェクトのコピーを作成するのではなく変更したい場合、PHP の「参照」変数を多用する必要があったことです。新しいアプローチでは、オブジェクトは値ではなくハンドルによって参照されます。 [ 226 ]
PHP 5 では、プライベートおよび保護されたメンバ変数とメソッド、抽象クラス、final クラス、抽象メソッド、final メソッドが導入されました。また、 C++などの他のオブジェクト指向言語と同様に、コンストラクタとデストラクタを宣言する標準的な方法と、標準的な例外処理モデルも導入されました。さらに、PHP 5 ではインターフェースが追加され、複数のインターフェースを実装できるようになりました。オブジェクトがランタイム システムとやり取りできるようにする特別なインターフェースがあります。ArrayAccessを実装するオブジェクトは配列構文で使用でき、 IteratorまたはIteratorAggregateを実装するオブジェクトは言語構造で使用できます。エンジンには仮想テーブル機能がないため、静的変数はコンパイル時に参照ではなく名前でバインドされます。[ 227 ] foreach
開発者が予約語を使用してオブジェクトのコピーを作成するとclone、Zend エンジンは__clone()メソッドが定義されているかどうかを確認します。定義されていない場合は、__clone()オブジェクトのプロパティをコピーするデフォルトメソッドが呼び出されます。__clone()メソッドが定義されている場合は、作成されたオブジェクトに必要なプロパティを設定する責任を負います。利便性のために、エンジンはソースオブジェクトのプロパティをインポートする関数を提供するため、プログラマはソースオブジェクトの値によるレプリカから開始し、変更する必要のあるプロパティのみをオーバーライドできます。[ 228 ]
PHP のプロパティとメソッドの可視性は、キーワードpublic、private、 およびを使用して定義されます。 varのみが使用されているprotected場合、デフォルトは public です。は の同義語です。 宣言された項目はどこからでもアクセスできます。 は、継承されたクラス(および項目を定義するクラス)へのアクセスを制限します。は、項目を定義するクラスのみに可視性を制限します。[ 229 ]同じ型のオブジェクトは、同じインスタンスでなくても、互いの private メンバーと protected メンバーにアクセスできます。[ 230 ]varpublicpublicprotectedprivate
以下は、PHP 8におけるオブジェクト指向プログラミングの基本的な例です。
<?php抽象クラスUser{protected string $name ;public function __construct ( string $name ){// 最初の文字を大文字にし、残りを小文字にする$this- > name = ucfirst ( strtolower ( $name ));}public function greet () : string{return "こんにちは、私の名前は " . $this -> name です。}abstract public function job () : string ;}クラスStudent はUserを継承します{public function __construct ( string $name , private string $course ){parent :: __construct ( $name );}public function job () : string{return "私は学びます " . $this -> course ;}}クラスTeacher はUserを継承します{public function __construct ( string $name , private array $teachingCourses ){parent :: __construct ( $name );}public function job () : string{return "私は教えています " . implode ( ", " , $this -> teachingCourses );}}$students = [新しい学生(「アリス」、「コンピュータサイエンス」)新しい学生(「ボブ」、「コンピュータサイエンス」)新入生( 「チャーリー」、「経営学」)];$教師= [新しい教師(「ダン」、[ 「コンピュータサイエンス」、「情報セキュリティ」])新しい教師(「エリン」、[ 「コンピュータサイエンス」、「3Dグラフィックスプログラミング」])新しい教師(「フランキー」、「オンラインマーケティング」、「ビジネス研究」、「Eコマース」)];foreach ([ $students , $teachers ] as $users ) {echo $users [ 0 ] :: class . "s: \n " ;array_walk ( $users , function ( User $user ) {echo " { $user -> greet () } , { $user -> job () } \n " ;});}このプログラムは以下を出力します。
生徒:こんにちは、アリスです。コンピュータサイエンスを学んでいます。こんにちは、ボブです。コンピュータサイエンスを学んでいます。 こんにちは、チャーリーです。ビジネス研究を学んでいます。教師:こんにちは、ダンです。コンピュータサイエンスと情報セキュリティを教えています。こんにちは、エリンです。コンピュータサイエンスと3Dグラフィックスプログラミングを教えています。こんにちは、フランキーです。オンラインマーケティング、ビジネス研究、Eコマースを教えています。唯一の完全な PHP 実装は、単に PHP として知られるオリジナルのものです。これは最も広く使用されており、Zend Engineによって動作します。他の実装と区別するために、非公式に「Zend PHP」と呼ばれることもあります。Zend Engine は、PHPソース コードを実行可能な内部形式にオンザフライでコンパイルするため、インタープリタとして機能します。[ 231 ] [ 232 ]また、PHP には正式な仕様がないため、Zend PHP のセマンティクスが PHP のセマンティクスを定義するため、これは PHP の「リファレンス実装」でもあります。Zend の動作方法によって定義される PHP の複雑で微妙なセマンティクスのため、競合する実装が完全な互換性を提供することは困難です。[ 233 ]
PHP のスクリプト実行ごとにリクエストが 1 つしか行われないモデルと、 Zend Engine がインタプリタであるという事実が非効率性につながり、その結果、PHP のパフォーマンスを向上させるためのさまざまな製品が開発されてきました。実行時間を短縮し、Web ページにアクセスするたびに PHP ソース コードをコンパイルする必要がないようにするために、PHP スクリプトは、PHP エンジンの内部フォーマットでデプロイすることもできます。これは、コンパイルされた PHP スクリプト (オペコード) を共有メモリにキャッシュすることで、スクリプトが実行されるたびにコードを解析してコンパイルするオーバーヘッドを回避する仕組みです。オペコードキャッシュであるZend Opcacheは、PHP バージョン 5.5 以降に組み込まれています。[ 234 ]広く使用されているオペコード キャッシュのもう 1 つの例は、 PECL拡張機能として利用可能なAlternative PHP Cache (APC) です。[ 235 ]
Zend PHPは依然として最も人気のある実装ですが、他にもいくつかの実装が開発されています。これらの実装の中にはコンパイラであったり、 JITコンパイルをサポートしているものもあり、完全なPHP互換性がない代わりにZend PHPよりもパフォーマンス面で優れています。代替実装には以下のようなものがあります。
PHPはPHPライセンスの下でリリースされたフリーソフトウェアであり、これは3条項BSDライセンスと同等である。[ 240 ]
8.6 より前のバージョンは、より制限的なライセンスの下でリリースされており、次のように規定されています。[ 241 ]
本ソフトウェアから派生した製品は、group@php.net からの事前の書面による許可がない限り、「PHP」という名称を使用したり、製品名に「PHP」を含めたりすることはできません。ただし、ソフトウェアが PHP と連携して動作することを示す場合は、「PHP Foo」や「phpfoo」ではなく、「Foo for PHP」と表記してください。
この「PHP」の使用制限により、PHPライセンスはGNU一般公衆ライセンス(GPL)と互換性がなくなり、Zendライセンスは元のBSDライセンスと同様の広告条項のために互換性がなくなりました。[ 242 ]
PHP は、ソース配布にさまざまなフリーおよびオープンソースのライブラリを含めたり、生成された PHP バイナリ ビルドでそれらを使用したりします。PHP は基本的にインターネット対応システムであり、ファイル転送プロトコル(FTP) サーバーや、PostgreSQL、MySQL、Microsoft SQL Server、SQLite (組み込みデータベース)、LDAPサーバーなど、多くのデータベース サーバーにアクセスするための組み込みモジュールを備えています。標準の PHP ビルドでは、 stdioファミリーなど、C プログラマーに馴染みのある多数の関数が利用できます。[ 243 ]
PHP では、開発者がC 言語で拡張機能を記述してPHP 言語に機能を追加できます。PHP 拡張機能は、PHP に静的にコンパイルすることも、実行時に動的にロードすることもできます。Windows API 、 Unix ライクなオペレーティングシステムでのプロセス管理、マルチバイト文字列 ( Unicode )、cURL、およびいくつかの一般的な圧縮形式のサポートを追加するために、多数の拡張機能が記述されています。拡張機能を通じて利用できるその他の PHP 機能には、インターネット リレー チャット(IRC) との統合、画像とAdobe Flashコンテンツの動的生成、データベースへのアクセスに使用される抽象化レイヤーとしてのPHP データ オブジェクト(PDO)、 [ 244 ] [ 245 ] [ 246 ] [ 247 ] [ 248 ] [ 249 ] [ 250 ]、さらには音声合成などがあります。文字列や配列を扱うなど、言語のコア機能の一部も拡張機能として実装されています。[ 251 ] PHP Extension Community Library (PECL) プロジェクトは、PHP 言語の拡張機能のリポジトリです。[ 252 ]コミュニティのほとんどはウェブ開発とサーバーサイドでのPHP実行(クライアントサイド用のJavaScriptも提供)に焦点を当てており、例外的な用途としては、スタンドアロンのグラフィカルアプリケーション(PHP-GTKは10年以上メンテナンスされていない)、[ 253 ]およびドローン制御などがあります。[ 254 ]
Zephirなどの他のプロジェクトでは、PHP拡張機能を高水準言語で作成し、ネイティブPHP拡張機能にコンパイルする機能を提供しています。このようなアプローチは、PHP拡張機能をC言語で直接記述するのではなく、拡張機能の開発を簡素化し、プログラミングとテストに必要な時間を短縮します。[ 255 ]
2018年12月までに、PHPグループは、Thies C. Arntzen、Stig Bakken、Shane Caraveo、Andi Gutmans、Rasmus Lerdorf、Sam Ruby、Sascha Schumann、Zeev Suraski、Jim Winstead、およびAndrei Zmievskiの10人で構成されていた。[ 256 ]
Zend Technologiesは、プログラマーが認定PHP開発者になるために、 PHP 8 [ 257 ]試験(以前はPHP 7および5.5に基づいていた)に基づくPHP認定を提供しています。
2021年11月26日、JetBrainsのブログはPHPの設計と開発を支援するPHP Foundationの設立を発表した。[ 259 ]
財団はPHP言語のコアリポジトリに取り組む「コア開発者」を雇用している。財団の理事であるロマン・プロンスキー氏は、開発者には「市場水準の給与」を支払うことを目指していると述べた。[ 263 ]
財団に対する反応は概ね好意的である。[ 264 ] [ 265 ]
ドイツのソブリン・テック・ファンドは、 PHP Foundationを支援するために20万ユーロ以上を提供した。[ 266 ]

PHP を Web サーバーにサポートする方法は主に 2 つあります。 ネイティブの Web サーバー モジュールとして追加する方法と、CGI 実行ファイルとして追加する方法です。PHP には、サーバー アプリケーション プログラミング インターフェイス(SAPI) と呼ばれる直接モジュール インターフェイスがあり、Apache HTTP Server、Microsoft IIS、Caddy (FrankenPHP 経由)、iPlanet Web Serverなど、多くの Web サーバーでサポートされています。OmniHTTPd などの他の Web サーバーは、Microsoftの Web サーバー モジュール インターフェイスであるインターネット サーバー アプリケーション プログラミング インターフェイス(ISAPI) をサポートしています。PHP が Web サーバー用のモジュール サポートを持っていない場合は、常に共通ゲートウェイ インターフェイス(CGI) またはFastCGIプロセッサとして使用できます。その場合、Web サーバーは PHP の CGI 実行ファイルを使用して PHP ファイルへのすべてのリクエストを処理するように構成されます。[ 267 ]
PHP-FPM(FastCGI Process Manager)は、PHP 用の代替 FastCGI 実装であり、バージョン 5.3.3 以降、公式の PHP ディストリビューションにバンドルされています。[ 268 ]以前の FastCGI 実装と比較すると、主に負荷の高い Web サーバーに役立ついくつかの追加機能が含まれています。[ 269 ]
PHP をコマンドライン スクリプトに使用する場合、PHPコマンドライン インターフェイス(CLI) 実行ファイルが必要です。PHP は、 PHP 4.3.0以降、 CLIサーバー アプリケーション プログラミング インターフェイス(SAPI) をサポートしています。 [ 270 ]この SAPI の主な焦点は、 PHP を使用してシェルアプリケーションを開発することです。CLI SAPI と他の SAPI の間にはかなりの違いがありますが、多くの動作を共有しています。[ 271 ]
PHP には、さまざまな Web サーバー用の SAPI と呼ばれる直接モジュール インターフェースがあります。[ 272 ] Windows 上の PHP 5 と Apache 2.0の場合、 php5apache2.dllというDLL ファイルとして提供されます。[ 273 ]これは、他の機能の中でも特に、PHP と Web サーバー間のインターフェースを提供するモジュールであり、サーバーが理解できる形式で実装されています。この形式が SAPI として知られています。
さまざまなWebサーバー拡張機能には、さまざまな種類のSAPIがあります。たとえば、上記に挙げたものに加えて、PHP言語用の他のSAPIには、共通ゲートウェイインターフェースとコマンドラインインターフェースがあります。[ 272 ] [ 274 ]
PHPは、 「PHP Desktop」を使用してデスクトップのグラフィカル ユーザー インターフェイス(GUI) アプリケーションを作成するためにも使用できます。GitHub 。または、PHP-GTK拡張機能は廃止されています。PHP-GTKは公式のPHPディストリビューションには含まれておらず、[ 267 ]拡張機能としてPHPバージョン5.1.0以降でのみ使用できます。PHP-GTKをインストールする最も一般的な方法は、ソースコードからコンパイルすることです。[ 275 ]
PHPがクラウド環境にインストールされ使用される場合、クラウド固有の機能を使用するためのソフトウェア開発キット(SDK)が提供されます。 [ 276 ]例えば、
多数の設定オプションがサポートされており、PHP のコア機能と拡張機能の両方に影響します。[ 279 ] [ 280 ]設定ファイルはphp.ini、PHP の使用方法に応じて異なる場所で検索されます。[ 281 ]設定ファイルはさまざまなセクションに分割されており、 [ 282 ]一部の設定オプションは Web サーバーの設定内でも設定できます。[ 283 ]

PHP は汎用スクリプト言語であり、特にサーバーサイドWeb 開発に適しています。この場合、PHP は通常Web サーバー上で実行されます。要求されたファイル内の PHP コードはPHP ランタイムによって実行され、通常はWeb サイトなどで使用される動的な Web ページコンテンツや動的な画像を作成します。 [ 284 ]また、コマンドラインスクリプトやクライアントサイドのグラフィカルユーザーインターフェイス(GUI) アプリケーションにも使用できます。PHP はほとんどの Web サーバー、多くのオペレーティングシステムおよびプラットフォームにデプロイでき、多くのリレーショナルデータベース管理システム(RDBMS)で使用できます。ほとんどのWeb ホスティングプロバイダーは、クライアントが使用できるように PHP をサポートしています。PHP は無料で利用でき、PHP グループはユーザーが独自の用途に合わせて構築、カスタマイズ、拡張できるように完全なソースコードを提供しています。[ 285 ]

元々は動的なウェブページを作成するために設計されたPHP は、現在では主にサーバーサイド スクリプトに重点を置いており、[ 286 ] 、 Python、MicrosoftのASP.NET、Sun MicrosystemsのJavaServer Pages、[ 287 ]など、ウェブ サーバーからクライアントに動的なコンテンツを提供する他のサーバーサイド スクリプト言語と似ています。PHP はまた、迅速なアプリケーション開発(RAD)を促進するための構成要素と設計構造を提供する多くのソフトウェア フレームワークの開発も引き付けています。これらの中には、 PRADO、CakePHP、Symfony、CodeIgniter、Laravel、Yii Framework、Phalcon、Laminasなどがあり、他のウェブ フレームワークと同様の機能を提供しています。mod_perl
LAMPアーキテクチャは、 Webアプリケーションをデプロイする方法としてWeb業界で人気を博しています。[ 288 ]このバンドルでは、 Linux、Apache、MySQLとともにPHPがPとしてよく使われますが、PはPython、Perl、または3つの組み合わせを指す場合もあります。同様のパッケージであるWAMPとMAMPは、 WindowsとmacOSでも利用可能で、最初の文字はそれぞれのオペレーティングシステムを表しています。PHPとApacheはどちらもmacOSの基本インストールの一部として提供されていますが、これらのパッケージのユーザーは、より簡単に最新の状態に維持できる、よりシンプルなインストールメカニズムを求めています。
より高度で具体的な使用シナリオでは、PHP はCまたはC++でカスタム拡張機能を記述するための明確に定義され文書化された方法を提供します。[ 289 ] [ 290 ] [ 291 ] [ 292 ] [ 293 ] [ 294 ] [ 295 ]拡張機能は、追加ライブラリの形で言語自体を拡張するだけでなく、真のコンパイル言語を使用することで、実行速度が重要で改善の余地がある場合に、実行速度を向上させる方法を提供します。[ 296 ] [ 297 ] PHP は、他のソフトウェア プロジェクトに組み込むための明確に定義された方法も提供します。このようにして、PHP は別のプロジェクトの内部スクリプト言語として簡単に使用でき、プロジェクト固有の内部データ構造との緊密なインターフェースも提供します。[ 298 ]
PHPはコア言語レベルでのマルチスレッドのサポートが不足しているため、賛否両論の評価を受けているが、 [ 299 ]スレッドの使用は「pthreads」 PECL拡張機能によって可能になっている。[ 300 ] [ 301 ]
PHP用のコマンドラインインターフェースであるphp-cliと、2つのActiveX Windows Script Hostスクリプトエンジンが開発されました。
PHPは、MediaWiki [ 302 ] WordPress [ 303 ] Joomla [ 304 ] Drupal [ 305 ] Moodle [ 306 ] eZ Publish、eZ Platform、SilverStripe [ 307 ]などのWeb コンテンツ管理システムで使用されています。
2013年1月現在 PHPは2億4000万以上の ウェブサイト(調査対象の39%)で使用され、210 万台のウェブサーバーにインストールされていました。[ 308 ]
2026年2月20日現在 (PHP 8.5 のリリースから 3 か月後 )、PHP は、言語が特定できた Web サイトの 72% でサーバーサイド プログラミング言語として使用されています。PHP 8 が最もよく使用されているバージョンで、PHP を使用している Web サイトの 56.6% がこのバージョンを使用しており、PHP 7 が 34.3%、PHP 5 が 9%、PHP 4 が 0.1% 使用されています。[ 195 ]
2019 年、国家脆弱性データベースにリストされているすべての脆弱性の 11% がPHP に関連していました。[ 313 ]歴史的に、このデータベースに 1996 年以降にリストされているすべての脆弱性の約 30% が PHP に関連しています。言語自体またはそのコアライブラリの技術的なセキュリティ上の欠陥は頻繁ではありません (2009 年に 22 件、全体の約 1% ですが、PHP はリストされているプログラムの約 20% に適用されます)。[ 314 ]プログラマーが間違いを犯すことを認識し、一部の言語には、多くの問題を引き起こす入力検証の欠如を自動的に検出する汚染チェックが含まれています。このような機能は過去に PHP 用に提案されましたが、却下されたか、提案が放棄されました。[ 315 ] [ 316 ] [ 317 ]
Suhosin [ 318 ]や Snuffleupagus [ 319 ]などのサードパーティプロジェクトは、言語の危険な部分を削除または変更することを目的としています。
歴史的に、古いバージョンの PHP には、一部の PHP アプリケーションがセキュリティ上の問題に陥りやすいような、ランタイム設定の構成パラメータとデフォルト値がありました。その中でmagic_quotes_gpcも、 register_globals[ 320 ]構成ディレクティブが最もよく知られていました。後者は、任意の URL パラメータを PHP 変数にし、攻撃者が初期化されていないグローバル変数の値を設定して PHP スクリプトの実行を妨害できるようにすることで、深刻なセキュリティ脆弱性への道を開きました。「マジック クォート」と「グローバル変数の登録」設定のサポートは PHP 5.3.0 以降非推奨となり 、PHP 5.4.0 から削除されました。[ 321 ]
実行時設定の脆弱性のもう 1 つの例は、アップロードされたファイルが保存されているディレクトリで PHP の実行を無効にしなかった場合 (たとえば、engine構成ディレクティブを使用するなど) [ 322 ]です。これを有効にすると、アップロードされたファイルに埋め込まれた悪意のあるコードが実行されることがあります。[ 323 ] [ 324 ] [ 325 ]ベスト プラクティスは、画像ディレクトリを Web サーバーからアクセスできるドキュメント ルートの外に配置し、中間スクリプトを介して提供するか、アップロードされたファイルが保存されているディレクトリで PHP の実行を無効にすることです。
また、共有ウェブホスティング環境でPHP拡張機能の動的ロード(enable_dl設定ディレクティブ経由)[ 326 ]を有効にすると、セキュリティ上の問題が発生する可能性があります。[ 327 ] [ 328 ]
暗黙の型変換によって異なる値が等しいとみなされる場合、プログラマの意図に反してセキュリティ上の問題が発生する可能性があります。たとえば、比較の結果は と'0e1234' == '0'なります。これは、数値として解析可能な文字列が数値に変換されるためです。この場合、最初に比較された値は、値 ( を持つ科学的表記trueとして扱われます。0 × 10 1234 ) はゼロです。このようなエラーは、MD5パスワードハッシュを比較した際に、 Simple Machines Forum [ 329 ] 、Typo3 [ 330 ]、phpBB [ 331 ]で認証の脆弱性を引き起こしました。推奨される方法は、 (タイミング攻撃の安全性のために)またはアイデンティティ演算子 ( )を使用することです。結果は になります。hash_equals()strcmp==='0e1234' === '0'false
Zone-Hが公開した2013 年の 17 万件を超えるWeb サイト改ざんの分析では、最も頻繁に (53%) 使用された手法はファイル インクルージョンの脆弱性の悪用であり、これは主に PHP 言語の構文、、、の安全でない使用に関連している。[ 332 ] [ 333 ]includerequireallow_url_fopen
PHPには、擬似乱数生成器を使用するrand()[ 334 ]およびmt_rand()[ 335 ]関数が含まれていますが、これらは暗号学的に安全ではありません。バージョン8.1以降では、システムが提供する暗号学的に安全な乱数源を使用する関数が含まれています。[ 336 ]random_int()
PHPのエントロピーソースに対して実行できる攻撃は、「シード攻撃」と「状態回復攻撃」の2つです。2012年時点で、$250のGPUは1秒間に最大230回のMD5計算を実行でき、$750のGPUは同時に4倍の計算を実行できます。[ 337 ] 「誕生日攻撃」と組み合わせると、深刻なセキュリティ脆弱性につながる可能性があります。
PHP開発チームは、各マイナーバージョンのリリース後2年間は公式のバグ修正を提供し、その後2年間はセキュリティ修正のみがリリースされます。[ 193 ]この後、リリースはサポート終了とみなされ、公式にはサポートされなくなります。
NaNとInfinityを整数にキャストすると常にゼロになるということは、クロスプラットフォームの一貫性が向上し、現在の結果よりも驚きが少なくなることを意味します。
少なくとも 2008 年以来、
PHP 6 を扱っていると称する書籍が店頭に並んでいます。しかし、2010 年 3 月現在、PHP
6 はリリースされていません
。
実際、リリースには程遠い状況です。最近の出来事から判断すると、PHP
6 は 2011 年までリリースされないでしょう
。
そもそもリリースされるかどうかも定かではありません。
の PHP のバージョンは 5.x リリース シリーズの一部でしたが、PHP
6 はリリースされません。「バージョン 6 はスキップします
。数年前に 6 の計画がありました
が、その計画は現在の計画とは大きく異なっていたからです」と Gutmans 氏は述べました。バージョン
7 に直接進むことで混乱を回避できます。
{{cite web}}: CS1 maint: url-status (リンク)PHP は MediaWiki が書かれているプログラミング言語です [...]
は[...]PHPで構築されました。
にはPHP
5.3.2以降が必要です。
{{cite news}}: CS1 maint: 数値名: 著者リスト (リンク)について絶対に知っておくべき最低限のことは?