PHP

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]。




