PHP: Hypertext Preprocessor

出典: フリー百科事典『ウィキペディア(Wikipedia)』
PHP Hypertext Preprocessorから転送)
移動先: 案内検索
PHP
PHP-logo.svg
パラダイム 命令型, オブジェクト指向
登場時期 1995年 (1995)
設計者 ラスマス・ラードフ
開発者 The PHP Group
最新リリース

7.1.2 - 2017年2月17日(4日前) (2017-02-17[1]

[+/−]
評価版リリース

7.1.0 Release Candidate 6 - 2016年11月10日(3か月前) (2016-11-10

[+/−]
型付け 強い動的型付け
影響を受けた言語 C, C++, Java, Perl, Tcl
プラットフォーム クロスプラットフォーム
ライセンス PHP License
ウェブサイト php.net
Wikibooks logo PHP - ウィキブックス

PHP: Hypertext Preprocessor(ピー・エイチ・ピー ハイパーテキスト プリプロセッサー)とは、動的にHTMLデータを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。一般的には PHP と省略して用いられており、これは「個人的なホームページ」を意味する英語の "Personal Home Page" に由来する[2]

PHPはサーバーサイド・スクリプト言語として利用されており、Webサーバ上で動作し、Webサーバ上でPHPスクリプトの文書が要求されるたびに、そのPHPスクリプトが実行され、結果をウェブブラウザに対して送信する。平易な文法のため初心者でも習得しやすく、また大規模な開発にも多く用いられている。多くのフレームワークやライブラリが存在し、開発の手助けとなっている。

数多くのオープンソースウェブアプリケーションに利用されている一方、しばしば脆弱性の報告がなされ、過去に深刻なセキュリティホールが何度か報告されている。

PHPのマスコットアニマルとしてはelePHPantというが用いられる。

特徴[編集]

PHPには以下の特徴を持ち合わせている。

  • サーバーサイドWebアプリケーション構築のための豊富な組み込み関数。
  • C言語Java言語に似た、平易な文法。
  • データベースへの容易なアクセス(組み込み関数、および、標準ライブラリPDOによる)。
  • クラスベースオブジェクト指向のサポート。
  • 例外処理 (try, catch, throw) のサポート。
  • 多くのオープンソースのフレームワークやライブラリが利用可能である。
  • ASP, JSPと似たHTML埋め込み型の構文をとる。ただし最近のフレームワークを使った開発では、埋め込み型の構文を使用しないことが多い。
  • 様々な付加機能がPEARというオンラインライブラリ集でモジュールとして提供されている。pearコマンドで導入/管理ができる。PerlでいうところのCPANである。Composer登場以後は、PEARと同様にPHPのパッケージ管理機能として利用されている。
  • ウィキ構築に用いられるソフトの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レイヤからできている。

しかし、一部の組み込み関数はプラットフォームごとに挙動が違うため、スクリプトによっては移植作業が必要になる場合がある。

また、.NET Framework上のPhalangerJITコンパイルを行うHHVMなど、公式のZend Engine以外にもPHPの実装が存在する。

Webサーバとの統合[編集]

PHPをWebサーバで動作させる方法には、実行ファイル形式 (CGI / FastCGI)、モジュール形式(mod_php / ISAPI など)がある。どの方法を利用するか(利用できるか)はWebサーバにより異なる。実行ファイル形式によるCGIはほぼ全てのWebサーバに対応しているが、Apacheで動作させる場合はmod_phpとFastCGI、IISで動作させる場合はFastCGIとISAPI、lighttpdNginxで動作させる場合はFastCGIが使用できる。

このほかにも、PHPに標準で実装されているWebサーバ用APIは多い。以下に一覧を挙げる。

とくに、HTTPリクエストの度にプロセスを起動させないインタフェース(Apacheとmod_phpの組み合わせ、またはlighttpdなどのFastCGIに対応したWebサーバ)での動作が高速である。

構文[編集]

文法はC言語JavaPerlなどのプログラミング言語から強く影響を受けている。 その開発の経緯から、PHPは非常に多くの組み込み関数を有しており、動的Webページを速やかに作成できるのが特徴である。

幾つかのサンプルコードとその実行結果を交え、PHPの文書構造を解説する。

基本と制御構造[編集]

PHPは<?php?>で囲まれた内部をPHPコードと認識し実行する。 ファイルの末尾が?>である場合にはこれを省略出来、また改行や空白などの混入を防ぐため省略することが推奨されている。

<?php
if ($a) {
?>
<div>HTMLコード</div>
<?php
} else {
?>
<span><?php echo "aは偽"; ?></span>
<?php
}

<?php?>で囲まれていない部分はプログラムとは解釈されずそのまま出力される。 PHPコード部分に文法上の問題がなければPHPはこれを実行する。 出力は以下のようになる(便宜上2通り記す)。

$aが真の時の出力
<div>HTMLコード</div>
$aが偽の時の出力
<span>aは偽</span>

if、else (elseif) は条件評価の制御構造としてよく知られた構文であり、他にもPHPではforwhile (do)、foreachswitch文などの制御構造がサポートされている。 breakcontinue等のループ制御構造文もあるが、ループ式を命名する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宣言なしで利用出来る。

$GLOBALS
グローバルスコープの変数の名前をキーとし、その名前の変数を参照する連想配列。

以下のグーパーグローバル変数はPHP4.1以降で利用可能である。 PHP4.0以前では括弧内のグローバル変数(スーパーグローバルではない)を用いてアクセスする必要があった。 これら括弧内の変数はPHP4.1で非推奨となり、PHP5.4で削除された。

$_SERVER ($HTTP_SERVER_VARS)
実行環境情報、特にサーバから提供される情報
$_ENV ($HTTP_ENV_VARS)
環境変数の連想配列
$_POST ($HTTP_POST_VARS)
HTTP POSTメソッドで渡された変数の連想配列
$_GET ($HTTP_GET_VARS)
HTTP GETメソッドで渡された変数の連想配列
$_COOKIE ($HTTP_COOKIE_VARS)
HTTP COOKIEとして渡された変数の連想配列
$_REQUEST
$_GET$_POST$_COOKIE$_FILESおよびURIクエリー(ロケーション)を連想配列として格納する。
$_FILES
HTTPファイルアップロード処理変数
$_SESSION
セッション変数の連想配列

全容把握には、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以降では、クラスの抽象化およびインタフェースが導入された。 これらの構文はJavaObjective-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();
}
interfaceの多重継承について[編集]

クラスと異なり、インタフェースには実装が伴わないことから多重継承が可能である。 複数のインタフェースを実装するには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]

PDO[編集]

PHPではMySQLPostgreSQLなど主要な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]

代表的なソフトウェア[編集]

ウェブアプリケーション、CMSなど[編集]

ウェブアプリケーション・フレームワーク[編集]

テンプレートエンジン[編集]

対応する主要DBMS[編集]

歴史[編集]

PHP 1.0[編集]

1995年6月8日にリリース。ラスマス・ラードフが開発。C言語で書かれた CGI 用のツール集だった。ラスマスはそれらのツール群を PHP (Personal Home Page Tools) と名づけた。初期は Perl で書かれていたという言説を見かけるが、それは誤り。[4]

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[編集]

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[編集]

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日にリリース。 以下の機能が追加になった[5]

PHP 5.4.0[編集]

2012年3月1日にリリース。 以下の機能が追加になった[6]

  • トレイト
  • 配列の短縮構文
  • 関数の返り値を配列として扱えるようになった
  • クロージャが $this を使えるようになった

PHP 5.5.0[編集]

2013年6月20日にリリース。 以下の機能が追加になった[7]

  • ジェネレータ
  • finallyキーワード
  • foreach が list() に対応
  • empty() が任意の式に対応
  • array リテラルと string リテラルのデリファレンス
  • ClassName::class によるクラス名の解決
  • OPcache 拡張モジュールの追加
  • foreach が非スカラーのキーに対応
  • Apache 2.4 ハンドラが Windows に対応
  • GD 拡張モジュールの改良
  • パスワードハッシュ関数(password_get_info、password_hash、password_needs_rehash、password_verify)の追加

PHP 5.6.0[編集]

2014年8月28日にリリース。主な新機能は以下の通り[8]

  • 定数やプロパティで式が使用可能に
  • 可変個引数用の ... 演算子導入
  • 累乗演算子 ** 導入
  • phpdbg の導入

PHP 6[編集]

PHP 5.3の次のリリースとなるべく開発されていたバージョン。エンジンの内部処理がUTF-16に置き換えられる計画であったが、多くの問題に見舞われたことから2010年に開発を断念。5.4へと置き換えられた[9]。また5.6の次のバージョンが7とされたことから、欠番となった。

PHP 7.0[編集]

2015年12月3日にリリースされた[10]。Zend Engineの改善を行うPHPNG (PHP Next-Gen) プロジェクトの成果を取り入れており、データ構造の改善などにより、前バージョンのPHP 5.6と比べて25%から70%の性能改善が図られている。また言語仕様も大きく拡張されており、引数のタイプヒンティングにスカラー型が指定できるようになる(タイプヒンティングは5.1で導入されたが、クラスや配列など一部の型に限られていた)他、戻り値へのタイプヒンティングも導入されており、前年に発表されたHHVM用プログラミング言語Hackの影響が見受けられるものになっている。[11]

PHP 7.1[編集]

2016年12月1日にリリースされた。型指定でスカラー型とNULLを許容するNULL許容型の追加、メソッドの返り値が無いことを示すvoidリターンタイプ、例外処理を書く際に一つのブロックで複数の例外タイプをキャッチするマルチキャッチなど、型を意識したコードを実装しやすくするための拡張が行われている[12]

Windows版について[編集]

Windows環境でApacheと組み合わせる場合、Windows版PHPやApacheの開発環境であるMicrosoft Visual C++のバージョンの関係から、ApacheのモジュールはApache公式サイトではなく、「Apache Lounge」なるサイトにあるものを使うように、PHPの公式サイトに記載されている。

脚注[編集]

関連項目[編集]

外部リンク[編集]