PHP: Hypertext Preprocessor PHP: Hypertext Preprocessor(ピー・エイチ・ピー ハイパーテキスト プリプロセッサー) とは、動的に HTML データを生成することによって、動的なウェブページを実現するこ とを主な目的としたプログラミング言語、およびその言語処理系である。 PHP はサーバーサイド・スクリプト言語として利用されており、Web サーバ上で動作し、 Web サーバ上で PHP スクリプトの文書が要求されるたびに、その PHP スクリプトが実 行され、結果をウェブブラウザに対して送信する。平易な文法のため初心者でも習得 しやすく、また大規模な開発にも多く用いられている。多くのフレームワークやライブラ リが存在し、開発の手助けとなっている。 数多くのオープンソースウェブアプリケーションに利用されている一方、しばしば脆弱 性の報告がなされ、過去に深刻なセキュリティホールが何度か報告されている。 名称 [編集] 正式名称は「PHP: Hypertext Preprocessor」であるが、一般的には「PHP」と省略して 用いられる。この PHP とは、Personal Home Page の頭文字に由来する[1]。 特徴 [編集] Web アプリケーションのサーバーサイド・スクリプトに専門化している。 C 言語や Java 言語に似た、平易な文法。 データベースへの容易なアクセス。(組み込み関数、および、標準ライブラリ PDO による。) クラスベースオブジェクト指向のサポート。 例外処理(try, catch, throw)のサポート。 多くのオープンソースのフレームワークやライブラリが利用可能である。 ASP, JSP と似た HTML 埋め込み型の構文をとる。ただし最近のフレームワー クを使った開発では、埋め込み型の構文を使用しないことが多い。 様々な付加機能が PEAR というオンラインライブラリ集でモジュールとして提供 されている。pear コマンドで導入/管理ができる。Perl でいうところの CPAN で ある。 ウィキ構築に用いられるソフトの MediaWiki(Wikipedia で使われている)や Pukiwiki を始めとして、数多くのオープンソースウェブアプリケーションに利用さ れている。 処理系本体は、C 言語で書かれている。 技術構成 [編集] スクリプト実行環境 [編集] 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 レイ ヤからできている。 しかし、一部の組み込み関数はプラットフォームごとに挙動が違うため、スクリプトに よっては移植作業が必要になる場合がある。 Web サーバとの統合 [編集] PHP を Web サーバで動作させる方法には、実行ファイル形式(CGI / FastCGI)、モジ ュール形式(mod_php / ISAPI など)がある。どの方法を利用するか(利用できるか) は Web サーバにより異なる。実行ファイル形式による CGI はほぼ全ての Web サーバ に対応しているが、Apache で動作させる場合は mod_php と FastCGI、IIS で動作させ る場合は ISAPI、lighttpd で動作させる場合は FastCGI が使用できる。 このほかにも、PHP に標準で実装されている Web サーバ用 SAPI は多い。以下に一 覧を挙げる。 CGI AOLserver Apache HTTP Server (バージョン 1.x 用 / 2.x 用) Sun Java System Web Server Roxen WebServer Tux ISAPI (Microsoft Internet Information Services 等) Caudium Continuity Pi3Web thttpd とくに、HTTP リクエストの度にプロセスを起動させないインタフェース(Apache と mod_php の組み合わせ、または FastCGI に対応した Web サーバ(lighthttpd など)など) での動作が高速である。 多くの構文を C 言語、Java、Perl などのプログラミング言語から借用しており、動的に 生成させるウェブ・ページを速やかに作成できるのが特徴である。 幾つかのサンプルコードとその実行結果を交え、PHP の文書構造を解説する。 基本と制御構造 [編集] PHP は"<?php" と "?>"で囲まれた内部を PHP コードと認識し実行する。それ以外の 部分は全て HTML コードとしてそのまま出力される。 <?php if ($a) { ?> <div>HTML コード</div> <?php } else { ?> <span><?php echo "a は偽"; ?></span> <?php } ?> <?php と?>で囲まれていない部分を除外した際に、構文通りの構造に文書がなってい れば PHP はこれを正しく実行する。出力は以下のようになる。(便宜上 2 通り記す) // $a が真の時の出力 <div>HTML コード</div> // $a が偽の時の出力 <span>a は偽</span> if、else(elseif)は条件評価の制御構造としてよく知られた構文であり、他にも PHP では for、while(do)、foreach、switch 文などの制御構造がサポートされる。break、continue 等の制御構造文もあるが、ループ式を命名する label 文構造はない。 記号$は変数であることを示し、続く文字はその名前である。PHP は比較的変数に寛 容であり、変数が確保されていない場合は、これをエラーとせずにヌルとして処理す る。 <?php $a = x; $$a = y; echo $x; ?> // $a==x; $x と等価 // y を出力 PHP は以下の型をサポートする o o o o o o o o 配列の使用法は以下のようになる。 // array 関数での生成 $a = array("wikipedia", "mediawiki", 3 => "commons"); echo $a[0]; # wikipedia echo $a[3]; # commons // 明示的な代入 $b[0] = "wikipedia"; $b[] = "mediawiki"; $b[] = "commons"; echo $b[2]; # commons PHP で定義されているスーパーグローバル変数を幾つか挙げる。 括弧とは同義である。過去のバージョンは括弧内のみでしか参照できないが、現在の バージョンでは利用は非推奨となっている。 以下は PHP4.1 以降で提供される。 全容把握には、var_dump 関数等で参照するとよい。 <?php var_dump($_SERVER); ?> クラスとオブジェクト [編集] オブジェクト指向の PHP はクラスとオブジェクトをサポートしている。以下にクラス等オ ブジェクトの例をあげる。 <?php class abc { public $a = null; public function b() { echo "abc クラス b メソッド", PHP_EOL; return "戻値:abc->b"; } public function abc() { echo "abc:コンストラクタ生成", PHP_EOL; } } class def extends abc { public function def() { echo "def:コンストラクタ生成 > "; echo "def 再定義メソッド(継承):", parent::b(), PHP_EOL; } public function b() { echo "オーバーライドされた b メソッド", PHP_EOL; } } $c = new abc(); $c->b(); $f = new def(); $f->b(); ?> PHP に於けるコンストラクタ生成の演算子は new である。extends でクラスの継承が可 能であるが多重継承はサポートされていない。メンバ変数を宣言し定義する際には private・public・protected(アクセス権)を用いる(過去のバージョンでは var が使われ ていた)。echo は続くオブジェクトを文字列として出力する PHP の文書構造である。 parent は継承されたメソッドが、インスタンスされオーバーライドされた結果、継承され なかったメソッドを参照出来る。ここで def クラスに継承されたメソッドは abc->b メソッ ドであり、def->b メソッドにより上書きされている。出力結果は以下の様になる。 abc:コンストラクタ生成 abc クラス b メソッド def:コンストラクタ生成 > abc クラス b メソッド def 再定義メソッド(継承):戻値:abc->b オーバーライドされた b メソッド アクセス権や final は PHP 5 で導入された概念である(一部除く)。final はメソッドを子ク ラスでオーバーライドすることを禁止する構造である。 インスタンス化されていない abc クラスの b メソッドを静的に呼び出したい場合、 // static: class abc { public static function b() { } } と static 宣言をせねばならない。宣言がない場合、全て public(どこからでも参照可)で 処理される。 なお var は互換性のため残されており、public と等価であるが、PHP5.1.3 以前の PHP5 はエラーとなる。protected は親クラ ス・派生クラス・ないしそれを実装するクラス自身 からのアクセスのみを許可し、private は定義クラス内部のみ参照が可能である。 抽象化は PHP 5 より導入された概念であり、インタフェースは Java のそれや Objective-C ので実装されているものである。 Objective-C と違い、インタフェースは いまのところこれはコードから定義部と実装部を完全に切り離すものではなく、定義 の必要性は無い。 やっていることは抽象クラス(抽象メソッド)とインタフェースは実質変わらないが、その 概念は異なる。 インターフェースはその処理内容を定義せずに定義されるが、抽象クラス(抽象メソッ ド)は実装部の具体的な処理のコードと共に定義されている。 インタフェースの実装 [編集] まず最初に具体的なソースコードを示す。 <?php interface classTemplates { public function methodAlpha($arg1, $arg2); public function methodBeta($arg1); } class appTemplate implements classTemplates { public function methodAlpha($arg1, $arg2) { } public function methodBeta($arg1) { } } ?> interface 接頭辞をつけテンプレートを定義し、implements をつけクラスに適用し実装 する。テンプレートは extends で継承可能である。 テンプレートは定義されていても 必ず適用されるクラスが必要なわけではない。ただし、適用する前に定義されている 必要がある。 いまのところ、定義できるのメンバは public(公開可視性)のあるメソッドだけである。 適用されたクラスに定義されたメソッドの「アクセス権・引数」が異なればエラーを引き 起こし、またクラスの名前と同じ interface は定義できない。 <?php interface classTemplatesModel { public function methodAlpha($arg1, $arg2); public function methodBeta($arg1); } interface classTemplates extends classTemplatesModel { public function methodGamma(); } ?> 今のところ、多重継承は出来ない。よって以下のコードは無効である <?php interface classTemplatesModel { public function methodAlpha($arg1, $arg2); public function methodBeta($arg1); } interface classTemplates extends classTemplatesModel { public function methodGamma(); } // このような implements の実装は無効。 class appTemplate implements classTemplates, classTemplatesModel { public function methodAlpha($arg1, $arg2) { } public function methodBeta($arg1) { } public function methodGamma() { } } ?> 抽象クラスの定義 [編集] クラス名に final と同じ様に接頭辞として 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(); ?> __construct() は PHP 5 からインスタンス生成の時に自動的に呼び出されるコンストラ クタ (__destruct()、デストラクタも実装された)。 protected (保護可視性) は、継承されたクラス・または内部 ($this、parent など) でな いと、使えないようにする宣言である。 抽象化されたクラスはインスタンスを生成出来ない。よって new Alpha(); とすること は出来ない。また、抽象化されたメソッドは継承しないと使用することは出来ない。 Beta クラスで実装された methodAlpha メソッド Alpha クラスで実装された methodBeta メソッド インスタンスを破棄、メモリを開放 [Alpha::destruct] PDO [編集] 詳細は「PHP Data Object」を参照 MySQL や PostgreSQL など主要な RDBMS へ の接続については、それぞれ専用の 関数ライブラリが用意されている。phpinfo()を表示させれば、その PHP バージョンにお けるインプリメント状況 を確認できる。関数の仕様については微妙な差があり、異な る RDBMS への移行には支障となる。そのリスクを軽減するのが PDO(PHP Data Object)と呼ばれる、共通する機能はなるべく同じインタフェースで実現しようというア イデアによる、抽象化ライブラリである。ただし文字列処理関数 など SQL ごとに存在 している差異までカバーしているわけではなく、移行に際してはそれなりの注意が必 要である。いくらか楽になるという程度の認識で、過 信は禁物といえよう。RDBMS ご とに、pdo_から始まる名称のドライバモジュールが提供されているが、最近の PHP5.2.5 などドライバモジュール が見当たらなくても、標準で組み込まれているケー スがある。 その他 [編集] include、require 等の演算子で外部ファイルに記述された PHP コードを追加ないし、参 照、実行が可能である。return は戻り値を返す文書構造である。return()とすることで 戻り値を評価することも可能である。 Unix コマンドを実行可能であるが、CGI より実行権限は低くなっている。また一部関数 はこの Unix コマンドを参照するため、Windows 系 OS では使用できない関数がある。 コマンドを参照する関数を使用する際は、サーバの設定でパスが通っている必要が ある。 幾つもの拡張により扱える関数は環境に依りまちまちである。詳しくは下記外部リンク のリファレンスを参照されたい。 ウェブアプリケーション、CMS など [編集] ウェブアプリケーション・フレームワーク [編集] PHP 1.0 [編集] 1995 年 6 月 8 日にリリース。ラスマス・ラードフが開発。初期は Perl でかかれたスク リプトだったが、その後 C 言語で書き直され、PHP (Personal Home Page Tools) とな る。 PHP Version 2 (PHP/FI) [編集] 1996 年 4 月 16 日にリリース。 FI(Form Interpreter、SQL による DBMS ツール)が統 合され、1997 年に PHP/FI2.0 となる。フルスペルは「Personal Home Page Construction Kit/Form Interpreter」。 PHP 3.0 [編集] 1998 年 6 月 6 日にリリース。 PHP/FI を元に、アンディ・ガトマンズとゼーブ・スラスキ ーによって PHP3(PHP:Hypertext Preprocessor) が再度書き直された。 PHP 4.0.0 [編集] 2000 年 5 月 22 日にリリース。 PHP3 を大幅に機能拡張。 Zend Engine 導入。 PHP 4.1.0 [編集] 2001 年 12 月 10 日にリリース。スーパーグローバル関数が追加される。 PHP 4.2.0 [編集] 2002 年 4 月 22 日にリリース。 register_globals の初期値が Off に変更される。 PHP 4.3.0 [編集] 2002 年 12 月 27 日にリリース。コマンドラインインタフェースの実装。 PHP 4.4.0 [編集] 2005 年 7 月 11 日にリリース。 2007 年 7 月 11 日、PHP4 のサポートを 2007 年 12 月 31 日をもって終了するという告 知がなされた。重大なセキュリティに関する修正のみ、2008 年 8 月 8 日まで継続され、 その後すべてのサポートは終了した。 PHP 5.0.0 [編集] 2004 年 7 月 13 日にリリース。擬似的なオブジェクト指向がより一層強化されると共に、 クラスライブラリとして SPL がサポートされた。 また、 SQLite が標準装備されるよ うになった。 Zend Engine 2.0 導入。 PHP 5.1.0 [編集] 2005 年 11 月 24 日にリリース。実行速度の改善、 PDO エクステンションが追加され る。 PHP 5.2.0 [編集] 2006 年 11 月 2 日にリリース。拡張モジュールに Filter (フィルタ) がデフォルトで追加 される。 PHP 5.3.0 [編集] 2009 年 6 月 30 日にリリース。 以下の機能が追加になった[2]。
© Copyright 2024 Paperzz