| PHP | |
|---|---|
| パラダイム | マルチパラダイム:命令型、関数型、オブジェクト指向、手続き型、リフレクション型 |
| デザイン: | ラスムス・ラードルフ |
| 開発者 | PHP 開発チーム、 Zend Technologies、 PHP Foundation |
| 初登場 | 1995年6月8日[ 1 ] [ 2 ] (1995年6月8日) |
| 安定版リリース | |
| タイピングの規律 | 動的、弱い、漸進的[ 4 ] |
| 実装言語 | C(主に、一部のコンポーネントはC++) |
| OS | Unix ライク、Windows、macOS、IBM i、OpenVMS、IBM Z |
| ライセンス | PHPライセンス[ a ] |
| ファイル名拡張子 | .php、、、、、.phar.phtml.pht.phps |
| Webサイト | php.net |
| 主要な実装 | |
| Zend Engine、HHVM、PeachPie、Quercus、Parrot | |
| 影響を受けた | |
| Perl、C、C++、Java、[ 6 ] 、 Tcl、[ 2 ]、JavaScript [ 7 ] | |
| 影響を受けた | |
| ハック、JSP、ASP、React JS | |
| |
PHPは、 Web開発向けの汎用スクリプト言語です。[ 8 ] 1993年にデンマーク系カナダ人のプログラマー、ラスムス・ラードルフによって作成され、1995年にリリースされました。 [ 9 ] [ 10 ] PHPのリファレンス実装は現在、PHPグループによって作成されています。[ 11 ] PHPはもともとPersonal Home Pageの略語でしたが、[ 12 ] [ 13 ]現在では再帰的な頭字語であるPHP: Hypertext Preprocessorを表しています。[ 14 ]
PHP コードは通常、モジュール、デーモン、またはCommon Gateway Interface (CGI) 実行可能ファイルとして実装されたPHPインタープリタによってWeb サーバー上で処理されます。Web サーバーでは、解釈および実行された PHP コードの結果 (生成されたHTMLやバイナリ画像データなど、任意のタイプのデータ) が、 HTTP応答の全体または一部を形成できます。さまざまなWeb テンプレート システム、Webコンテンツ管理システム、およびWeb フレームワークが存在し、それらを使用して、その応答の生成を調整または容易にすることができます。さらに、PHP は Web コンテキストの外部のプログラミング タスクにも使用できますが、Web 以外の用途での使用はまれです。PHP コードは、コマンド ラインから直接実行することもできます。
Zend Engineを搭載した標準PHPインタープリタは、 PHPライセンスの下でリリースされたフリーソフトウェアです。PHPは広く移植されており、様々なオペレーティングシステムやプラットフォーム上のほとんどのウェブサーバーに導入できます。[ 15 ]
PHP 言語は当初、正式な仕様や標準が文書化されることなく発展し、オリジナルの実装が事実上の標準として機能し、他の実装がそれに追随することを目指しました。
PHPの開発は1993年[ 9 ]に始まり、ラスマス・ラードルフが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は、シンプルで動的なウェブアプリケーションの構築に使用できます。バグ報告の迅速化とコードの改善のため、ラードルフは1995年6月8日にUsenetのディスカッショングループcomp.infosystems.www.authoring.cgiで、PHP/FIのリリースを「Personal Home Page Tools (PHP Tools) version 1.0」として最初に発表しました。 [ 1 ] [ 19 ]このリリースには、 Perl風の変数、フォーム処理、 HTML埋め込み機能などの基本機能が含まれていました。この時点で、構文はPerlに似たものに変更されていましたが、より単純で制限が多く、一貫性も低くなっていました。[ 12 ] [ 11 ]
初期のPHPは、新しいプログラミング言語として意図されたものではなく、むしろ有機的に成長していきました。ラードルフは当時を振り返ってこう述べています。「PHPの成長を止める術はありません。[...] プログラミング言語を書くつもりは全くありませんでした。[...] プログラミング言語の書き方は全く分かりません。[...] ただ、論理的に次の段階を着実に追いかけていっただけです。」[ 20 ]開発チームが結成され、数ヶ月にわたる作業とベータテストを経て、1997年11月にPHP/FI 2が正式にリリースされました。[ 21 ]
PHPは元々設計されたものではなく、有機的に開発されたため、関数の命名やパラメータの順序に一貫性がありませんでした。[ 22 ]関数名はPHPが「ラップ」している低レベルライブラリに合わせて選ばれることもありました。[ 23 ]また、PHPの初期のいくつかのバージョンでは、関数名の長さがハッシュ関数として内部的に使用されていたため、ハッシュ値の分散を改善するために名前が選ばれました。[ 24 ]
1997年にZeev SuraskiとAndi Gutmansはパーサーを書き直してPHP 3の基礎を築き、言語名を再帰的な頭字語PHP: Hypertext Preprocessorに変更した。[ 11 ] [ 25 ]その後、PHP 3の公開テストが開始され、1998年6月に正式リリースされた。SuraskiとGutmansはPHPのコア部分の書き直しを開始し、1999年にZend Engineを開発した。 [ 26 ]彼らはまた、イスラエルのラマトガンにZend Technologiesを設立した。[ 11 ]
2000年5月22日、Zend Engine 1.0を搭載したPHP 4.0がリリースされました。[ 11 ] 2008年8月までに、このブランチはバージョン4.4.9に達しました。PHP 4は現在開発が終了しており、セキュリティアップデートのリリースも予定されていません。[ 27 ] [ 28 ]
2004年7月1日、新しいZend Engine 2.0を搭載したPHP 5.0がリリースされました。[ 11 ] PHP 5.0では言語に大きな変更が加えられ、特にオブジェクト指向プログラミングへのアプローチの見直し、イテレータと例外が導入されました。[ 29 ]
PHP 5.1 と PHP 5.2 は翌年にリリースされ、PHP Data Objects (PDO) 拡張機能 (データベースにアクセスするための軽量で一貫性のあるインターフェイスを定義する) などの小さな改善と新機能が追加されました。2008 年には、PHP 5.x が開発中の唯一の安定したバージョンになりました。
多くの著名なオープンソースプロジェクトは、PHP 4からPHP 5への移行を推進するPHP開発者のコンソーシアムによって提供されたGoPHP5イニシアチブ[ 30 ]により、2008年2月5日から新しいコードでPHP 4のサポートを停止しました。[ 31 ] [ 32 ]
PHPのネイティブ文字列関数は生のバイト列に対してのみ動作し、マルチバイト文字エンコーディングでの使用は困難でした。[ 33 ] [ 34 ] 2005年に、Andrei Zmievskiが率いるプロジェクトが開始され、PHP全体にネイティブUnicodeサポートが導入されました。これは、 International Components for Unicode (ICU)ライブラリを埋め込み、テキスト文字列を内部的にUTF-16として表現することでした。[ 35 ]これにより、言語内部とユーザーコードの両方に大きな変更が生じるため、当時開発中だった他の主要な機能とともに、これを言語バージョン6.0としてリリースすることが計画されました。[ 36 ]
しかし、必要な変更を理解している開発者が不足していることと、ウェブのコンテキストではほとんど使用されない UTF-16 との間の変換によって生じるパフォーマンスの問題により、プロジェクトは遅延しました。[ 37 ]その結果、2009年に PHP 5.3 リリースが作成され、2010年3月に現在の形式のプロジェクトは正式に放棄され、PHP 6 から残っている非 Unicode 機能のほとんどを含む PHP 5.4 リリースが準備されました。[ 38 ]当初は Unicode 統合のための新しい計画が形成されることを期待していましたが、2014年までに何も採用されませんでした。
PHP 5.3は、もともと6.0の一部となることを意図していた機能を含んでいたため、名前空間、クロージャ、遅延静的バインディングのサポートが追加され、[ 39 ] [ 40 ]、標準関数に対する多くの修正と改善が行われた重要なリリースでした。
Unicodeブランチが正式に廃止されたことに伴い、2011年に新しいリリースプロセスが採用され、年間リリースサイクルが計画され、「機能リリース」(xyzからx.y+1.z)と「メジャーリリース」(xyzからx+1.0.0)が明確に区別されました。[ 41 ] 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ビルドのみであり、[ 42 ] [ 43 ] 、64ビット版Windowsプラットフォームでインターネットインフォメーションサービス(IIS)を使用するにはWindows 32ビット互換モードが必要でした。PHPバージョン5.5では、Microsoft Windowsで64ビット版x86-64ビルドが利用可能になりました。[ 44 ]
PHP 5.6の公式セキュリティサポートは2018年12月31日に終了しました。[ 45 ]
2014年から2015年にかけて、PHPの新しいメジャーバージョンであるPHP 7.0が開発されました。このバージョンの番号付けについては、社内開発者の間で議論がありました。[ 46 ] PHP 6のUnicode実験はまだリリースされていませんでしたが、いくつかの記事や書籍のタイトルでPHP 6の名前が参照されており、新しいリリースでその名前を再利用すると混乱が生じる可能性がありました。[ 47 ]投票の結果、PHP 7という名前が選ばれました。[ 48 ]
PHP 7.0の基礎は、当初PHP次世代(phpng )と呼ばれていたPHPブランチでした。これはDmitry Stogov、Xinchen Hui、Nikita Popovによって書かれ、[ 49 ] Zend EngineをリファクタリングすることでPHPのパフォーマンスを最適化することを目指し、ほぼ完全な言語互換性を維持しました。[ 50 ] 2014年7月14日までに、 phpngプロジェクトのメインベンチマークスイートとして機能したWordPressベースのベンチマークは、ほぼ100%のパフォーマンス向上を示しました。phpngからの変更は、よりコンパクトなデータ構造などの変更がジャストインタイム( JIT)コンパイラへの移行に適していると考えられるため、将来のバージョンでのパフォーマンス向上を容易にします。[ 51 ]大幅な変更があったため、改良されたZend Engineは、PHP 5.xで使用されていたZend Engine 2の後継として、Zend Engine 3と呼ばれました。[ 52 ]
PHP 7.0には、2011年に合意されたバージョン管理方式で「メジャーバージョン」に許可されている下位互換性のない変更も含まれていました。 [ 41 ]コア言語の変更には、変数の逆参照のより一貫した処理、[ 53 ]foreachステートメントのより予測可能な動作、[ 54 ]ビットシフトのプラットフォーム一貫性[ 55 ]および浮動小数点から整数への変換が含まれていました。[ 55 ] [ 56 ]メンテナンスされていない、または非推奨のサーバーアプリケーションプログラミングインターフェース(SAPI)と拡張機能がPHPコアから削除されました。最も顕著なのはレガシーmysql拡張機能です。[ 57 ]<% ASPスタイルの区切り文字や%>などの他のレガシー機能も削除されました<script language="php"> ... </script>。[ 58 ]
PHP 7.0は、PHPの型システムの拡張の始まりとなりました。PHP 5.xでは関数のパラメータのみに型宣言が可能でしたが、7.0では関数の戻り値に拡張されました。[ 59 ]また、7.4ではオブジェクトのプロパティにも拡張されました。 [ 60 ]表現可能な型も拡張され、7.0ではスカラー型(整数、浮動小数点数、文字列、ブール値)が、 [ 61 ]iterable型、[ 62 ] null許容型、[ 63 ]戻りvoid値型[ 64 ]はすべて7.1で、 7.2では型が[ 65 ]objectになりました。
この時期の他の変更は、言語の表現力を高めることを目的としており、7.0では??( null合体) [ 66 ] や<=>「宇宙船」3者間比較[ 67 ]演算子、PHP 7.1では配列の逆参照[ 68 ]や複数の例外タイプのキャッチ[ 69 ]のための新しい構文、7.3ではより柔軟なヒアドキュメントとナウドキュメント構文[ 70 ]、7.4ではヌル合体代入演算子[ 71 ]が導入されました。
PHP 8.0は、以前のバージョンから大幅な変更が加えられたメジャーバージョンとして、2020年11月26日にリリースされました。 [ 72 ] [ 73 ]
最も注目を集めた変更点の1つは、 JITコンパイラの追加です。これにより、いくつかのユースケースで大幅なパフォーマンスの向上が期待できます。[ 74 ] [ 75 ]一般的なウェブ開発のユースケースよりも、数学的な操作で大幅な改善が期待できます。[ 76 ]さらに、JITコンパイラのパフォーマンス上の利点により、一部のコードをCからPHPに移行する可能性が生まれます。[ 77 ]
8.0で言語に追加された重要な機能は属性で、クラス、メソッド、パラメータなどのプログラム要素にメタデータを追加することができます。[ 72 ]その後のバージョンでは、言語の動作を変更する組み込み属性が追加されました。たとえば、PHP 8.2の属性、[ 78 ] PHP 8.3の属性、[ 79 ] PHP 8.4の属性、[ 80 ] PHP 8.5の属性と属性などです。 [ 81 ] [ 82 ] [ 83 ]#[\SensitiveParameter]#[\Override]#[\Deprecated]#[\NoDiscard]#[\DelayedTargetValidation]
言語の型システムの重要な拡張は、複合型の追加です。PHP 8.0 の共用体型(例:「整数または文字列」を意味する)、[ 84 ] PHP 8.1 の交差型(例:「値は との両方のインターフェースを実装する必要がある」を意味する)、[ 85 ] PHP 8.2 の選言正規形(DNF)型( などの交差の共用体)[ 86 ]追加の特殊型キーワードが追加されました。PHP 8.0 の および、[ 72 ] PHP 8.1 の(関数が決して返さないことを示すボトム型) [ 87 ] PHP 8.2 では、、、 がスタンドアロン型として追加されました。[ 88 ] [ 89 ]int|stringTraversable&CountableTraversableCountablearray|(Traversable&Countable)mixedstaticnevernullfalsetrue
豊富な型システムの追加は、より厳密な言語への一般的な傾向の一部であり、PHP 8.0では、文字列と数値の比較、[ 90 ]、数値文字列、[ 91 ] 、および互換性のないメソッドシグネチャ[ 92 ]の処理に重大な変更が含まれていました。それ以降のバージョンでは、将来のメジャーバージョンで重大な変更として計画されている動作、たとえばnullnull可能でない内部関数パラメータへの渡し[ 93 ]や、クラスで宣言されていないプロパティの参照[ 94 ]などについて、非推奨の通知が導入されました。
| バージョン | 発売日 | [ 95 ]までサポート | 注記 |
|---|---|---|---|
| サポート対象外: 1.0 | 1995年6月8日 | 正式名称は「Personal Home Page Tools (PHP Tools)」。これが「PHP」という名称が初めて使用された例である。[ 11 ] | |
| サポート対象外: 2.0 | 1997年11月1日 | 正式名称は「PHP/FI 2.0」。PHPと呼べる最初のリリースであり、現在まで多くの機能を備えたスタンドアロン言語です。 | |
| サポート対象外: 3.0 | 1998年6月6日 | 2000年10月20日[ 95 ] | 開発は1人から複数の開発者へと移行しました。Zeev SuraskiとAndi Gutmansがこのバージョンのベースを書き直しました。[ 11 ] |
| サポート対象外: 4.0 | 2000年5月22日[ 96 ] | 2001年6月23日[ 95 ] | Zend Engineと呼ばれる、より高度な2段階解析/実行タグ解析システムを追加しました。[ 97 ] |
| サポート対象外: 4.1 | 2001年12月10日[ 98 ] | 2002年3月12日[ 95 ] | 「スーパーグローバル」の導入(、、$_GETなど)[ 97 ]$_POST$_SESSION |
| サポート対象外: 4.2 | 2002年4月22日[ 99 ] | 2002年9月6日[ 95 ] | デフォルトでは無効になっていますregister_globals。ネットワーク経由で受信したデータはグローバル名前空間に直接挿入されなくなり、アプリケーションのセキュリティホールの可能性が排除されます。[ 97 ] |
| サポート対象外: 4.3 | 2002年12月27日[ 100 ] | 2005年3月31日[ 95 ] | CGIを補完するためにコマンドラインインターフェース(CLI)を導入した。 [ 97 ] [ 101 ] |
| サポート対象外: 4.4 | 2005年7月11日[ 102 ] | 2008年8月7日[ 95 ] | PHPバージョン4.3.xでコンパイルされた拡張機能とのバイナリ互換性を壊す必要があったメモリ破損のバグを修正しました。[ 103 ] |
| サポート対象外: 5.0 | 2004年7月13日[ 104 ] | 2005年9月5日[ 95 ] | 新しいオブジェクトモデルを備えたZend Engine II。[ 105 ] |
| サポート対象外: 5.1 | 2005年11月24日[ 106 ] | 2006年8月24日[ 95 ] | 再設計されたPHPエンジンにおけるコンパイラ変数の導入によるパフォーマンスの向上。[ 105 ]データベースにアクセスするための一貫したインターフェースとしてPHPデータオブジェクト(PDO)を追加しました。[ 107 ] |
| サポート対象外: 5.2 | 2006年11月2日[ 108 ] | 2011年1月6日[ 95 ] | フィルター拡張機能をデフォルトで有効化。ネイティブJSONサポート。[ 105 ] |
| サポート対象外: 5.3 | 2009年6月30日[ 109 ] | 2014年8月14日[ 95 ] | 名前空間のサポート、遅延静的バインディング、ジャンプ ラベル (制限付きgoto )、匿名関数、クロージャ、PHP アーカイブ (phar)、循環参照のガベージ コレクション、改善されたWindowsサポート、sqlite3、 MySQLで動作する拡張機能の基礎となるライブラリとしての libmysql の代替としての mysqlnd 、より優れたMIMEサポートのための mime_magic の代替としての fileinfo 、国際化拡張機能、および ereg 拡張機能の廃止。 |
| サポート対象外: 5.4 | 2012年3月1日[ 110 ] | 2015年9月3日[ 95 ] | 特性のサポート、短い配列構文のサポート。削除された項目: 、、、、、register_globals。組み込みのWebサーバー。[ 111 ]機能とパフォーマンスの改善、メモリ要件の削減 safe_mode。allow_call_time_pass_referencesession_register()session_unregister()session_is_registered() |
| サポート対象外: 5.5 | 2013年6月20日[ 112 ] | 2016年7月10日[ 113 ] | ジェネレータ、finally例外処理ブロック、OpCache(Zend Optimizer+ベース)のサポートが公式ディストリビューションにバンドルされています。 [ 114 ] |
| サポート対象外: 5.6 | 2014年8月28日[ 115 ] | 2018年12月31日[ 113 ] | 定数スカラー式、可変個引数関数、引数の展開、新しい指数演算子、use関数と定数のステートメントの拡張、SAPIモジュールとしての新しいphpdbgデバッガ、その他の小さな改善。[ 116 ] |
| 6.x | 未公開 | 該当なし | ネイティブUnicodeサポートを組み込む予定だったPHPの廃止されたバージョン。[ 117 ] [ 118 ] |
| サポート対象外: 7.0 | 2015年12月3日[ 119 ] | 2019年1月10日[ 41 ] | Zend Engine 3(パフォーマンスの向上[ 51 ]とWindowsでの64ビット整数のサポート[ 120 ])、統一された変数構文、[ 53 ] ASTベースのコンパイルプロセス、[ 121 ]の追加、[ 122 ]プラットフォーム間でのビット単位のシフトの一貫性、[ 123 ](ヌル合体)演算子、[ 66 ] Unicodeコードポイントエスケープ構文、[ 124 ]戻り値の型宣言、[ 59 ]スカラー型(整数、浮動小数点数、文字列、ブール値)宣言、[ 61 ]「宇宙船」3者間比較演算子、[ 67 ]ジェネレータの委譲、[ 125 ]匿名クラス、[ 126 ]よりシンプルで一貫性のあるCSPRNG API、[ 127 ]多くのPHP内部「エラー」をより現代的な例外に置き換え、[ 128 ]複数のアイテムをインポートするためのショートカット構文名前空間。[ 129 ]Closure::call()??<=> |
| サポート対象外: 7.1 | 2016年12月1日 | 2019年12月1日[ 113 ] | iterable型、[ 62 ] null許容型、[ 63 ]void戻り値の型、[ 64 ]クラス定数の可視性修飾子、[ 130 ]短いリスト構文、[ 68 ]多重キャッチ[ 69 ] |
| サポート対象外: 7.2 | 2017年11月30日 | 2020年11月30日[ 113 ] | objectパラメータと戻り値の型の宣言、[ 65 ] libsodium拡張、[ 131 ]抽象メソッドのオーバーライド、[ 132 ]パラメータの型の拡張[ 133 ] |
| サポート対象外: 7.3 | 2018年12月6日[ 134 ] | 2021年12月6日 | 柔軟なHeredocとNowdoc構文、[ 70 ]参照代入と配列分解のサポート、[ 135 ] PCRE2サポート、[ 136 ]関数[ 137 ]list()hrtime |
| サポート対象外: 7.4 | 2019年11月28日[ 138 ] | 2022年11月28日 | 型付きプロパティ、[ 60 ]プリロード、[ 139 ] null合体代入演算子、[ 71 ]改善openssl_random_pseudo_bytes、[ 140 ]弱参照、[ 141 ]外部関数インターフェース(FFI)、[ 142 ]常に利用可能なハッシュ拡張、[ 143 ]パスワードハッシュレジストリ、[ 144 ]マルチバイト文字列分割、[ 145 ]参照のリフレクション、[ 146 ] ext/wddxのアンバンドル、[ 147 ]新しいカスタムオブジェクトシリアル化メカニズム[ 148 ] |
| サポート対象外: 8.0 | 2020年11月26日[ 149 ] | 2023年11月26日 | ジャストインタイム(JIT)コンパイル、[ 150 ]負のインデックスで始まる配列、[ 151 ]より厳密で健全な言語セマンティクス(抽象特性メソッドの検証)、[ 152 ]より健全な文字列と数値の比較、[ 90 ]より健全な数値文字列、[ 91 ]TypeError無効な算術演算子/ビット演算子について、[ 153 ]さまざまなエンジンエラーの再分類、[ 154 ]内部関数の一貫性のある型エラー、[ 155 ]互換性のないメソッドシグネチャの致命的なエラー、[ 92 ]ロケールに依存しない浮動小数点から文字列への変換、[ 156 ]変数構文の調整、[ 157 ]属性、[ 158 ] [ 159 ] [ 160 ] [ 161 ]名前付き引数、[ 162 ]一致式、[ 163 ]コンストラクタプロパティの昇格、[ 164 ]共用体型、[ 84 ]mixed型、[ 165 ]静的戻り値型、[ 166 ] nullsafe演算子、[ 167 ]非キャプチャキャッチ、[ 168 ]throw式、[ 169 ] JSON拡張は常に利用可能です。[ 170 ] |
| サポート対象外: 8.1 | 2021年11月25日[ 171 ] | 2025年12月31日 | 明示的な8進整数リテラル表記、[ 172 ]列挙型、[ 173 ]読み取り専用プロパティ、[ 174 ]第一級呼び出し可能構文、[ 175 ]new初期化子内、[ 176 ]純粋交差型、[ 85 ]never戻り値の型、[ 87 ]finalクラス制約、[ 177 ]ファイバー[ 178 ] |
| サポート対象:8.2 | 2022年12月8日[ 179 ] | 2026年12月31日 | 読み取り専用クラス、[ 180 ]null、、スタンドアロン型としてのfalse[ 88 ] [ 89 ]ロケールに依存しない大文字小文字の変換、[ 181 ]選言正規形型、[ 86 ]特性内の定数[ 182 ]true |
| サポート対象: 8.3 | 2023年11月23日[ 183 ] | 2027年12月31日 | 型付きクラス定数、[ 184 ]動的クラス定数フェッチ、[ 185 ] 属性、[ 79 ]読み取り専用プロパティのディープクローン、[ 186 ]新しい関数、[ 187 ]ランダマイザーの追加、[ 188 ]コマンドラインリンターが複数のファイルをサポート #[\Override]json_validate |
| サポート対象: 8.4 | 2024年11月21日[ 189 ] | 2028年12月31日 | プロパティ フック、非対称の可視性、更新されたDOM API、パフォーマンスの向上、バグ修正、および一般的なクリーンアップ。 |
| 最新バージョン:8.5 | 2025年11月20日[ 190 ] | 2029年12月31日 | パイプオペレーター|>[ 191 ] |
伝説: サポートされていません サポートされている 最新バージョン プレビュー版 将来のバージョン | |||
2011年6月28日より、PHP開発チームはPHPの新バージョンリリースのタイムラインを導入しました。[ 41 ]このシステムでは、少なくとも毎月1回のリリースを実施します。年に1回、新機能を含むマイナーリリースを実施します。すべてのマイナーリリースは、セキュリティとバグ修正を含む少なくとも2年間のサポートを受け、その後少なくとも1年間はセキュリティ修正のみを実施します。つまり、マイナーリリースごとに合計3年間のリリースプロセスとなります。この3年間のリリースプロセスでは、小規模で自己完結的な機能を除き、マイナーリリースに新機能を導入することはできません。2024年のRFCでは、セキュリティ修正のみの期間が2年間に延長され、すべてのサポート終了日が12月31日に固定され、「小規模で自己完結的な」機能をパッチバージョンに導入できるという例外が削除されました。[ 192 ]
W3Techsは、2025年11月現在(PHP 7が廃止されてから約3年後、PHP 8.3がリリースされてから23か月後)、PHP 7などのサポートされていないバージョンが、PHPウェブサイトの半分以上でまだ使用されており、古くて安全でないことがわかっていると報告しています。[ 193 ] [ 194 ]これには、20年以上前にリリースされた、さらに古く(7年前に廃止された)安全でないPHP 5を使用しているPHPウェブサイトの9.7%が含まれていました。

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

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

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

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

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