◇PHPとは
簡単に述べると、PHPの実体は、Webサーバに置かれるソフトウエアの Apache モジュールとして動作するスクリプト言語を実行する環境を指します。HTML文書中に記述されたスクリプトを PHPが実行し、結果をHTMLデータとしてWebブラウザに出力する仕組みがあります。
その意味では、PHPを実行させるためのApacheモジュールを Webサーバに置かなければなりません。幸いなことに、 Apache は、世界中で最も普及しているオープン・ソフトであるため、ほとんどの Webサーバに実装されています。
□PHPの生い立ち
1994年秋、Rasmus Lerdorf氏(グリーンランド生まれのデンマーク育ち) が自分の履歴書ページの閲覧者を調べるために作っていた Perl スクリプト 「Personal Home Page Tools」 を C言語で書き直し、HTMLフォームを扱える動的な Webアプリケーションのための機能 「Form Interpreter」 に拡張したのが始まりとされ、その頭文字をとって、「PHP/FI」と呼ばれました。
Rasmus Lerdorf氏はこのソフトウエアの開発に誰でも参加できるようにしていたことから、つまりオープン・ソースとしたことで大勢の開発者の支持を得ました。
PHP開発の主体は個人からグループへ変化し、やがて、C、Perl、Java、VisualBasicの新しい仕様まで取り入れるように拡張されました。
その後、技術者にとって非常に取り組みやすい新しい開発言語として発展したことは、現在の PHPの普及をみれば理解できることでしょう。
現在では、PHPの略として「PHP is Hypertext Pre-processer」として呼ばれるようになっています。
なおこのページの執筆時点では、PHP4.3までがバージョンとしてリリースされている関係で、PHPプログラミングに関しては、PHP4.3を基本として解説します。
( 追記: 2004年3月にPHP5.0がリリースされています。 )
□何故 PHPなのか?
PHPは、Webサーバ上で情報を提供し表現するHTMLに埋め込むタイプのスクリプト言語で、 JavaScript と同じように、プログラムのコンパイル(実行可能なバイナリファイル作成)をする必要のない、テキストベースのインタープリター言語です。
Webアプリケーションを開発する言語は、お馴染みの Perl 、Java、Ruby、ASPなどが挙げられます。古くからそうした多くの開発言語がありながら、何故今 PHPが注目されているのでしょうか?
CGIプログラムを開発する Perl 言語は、多くの Webアプリケーションで利用されてきました。多分これからもその主役の座を担うことでしょう。しかし、 Perl は、言語的に難しくソースコードが汚くなりやすい欠点を持っています。
PHPは、 Perl と同様にテキストベースで構築できる手軽さがあります。基本的には、HTMLファイルに埋め込む言語であるため、簡単なテキストエディタがあれば、誰でも書くことができます。加えて、CGIのようなサーバ負担も少なく、実行が早い利点も持っています。
以下に、PHPが利用されている理由を列挙しました。

こうした特徴を持つPHPは、 Yahoo 楽天 などの商用サイトでも採用され、素早い開発が行われています。また、多くの WebサーバでもPHPを実装しつつあることから、より多くのサイトでもPHPの採用が進められています。
□LAMPプラットフォーム
オープン・ソース・ソフトウェアとして普及しているプラットフォームにLinuxがあります。オープンであるが故に、世界中の技術者がボランティアとして開発され日々成長しています。
何より大きな特徴として、このLinuxがオープンであること、つまり無償で誰もが自由に利用でき、自由に改変し再配布することができるということです。
このLinuxをベースとして、同じくオープン・ソース・ソフトウェアの Apache MySQL データベース、そして PHPを組み合わせたのを、LAMPプラットフォームと呼んでいます。
Linuxは、標準で Apache を実装し、Linuxディストリビュータの中には、最初からPHPや MySQL をインストールできるようになっているものさえあります。
現在、私の部屋にあるRed Hat Linuxには、これらのソフトウェアが実装されて、約1年前から Webアプリケーション開発に勤しんでいます。
□Windowsプラットフォーム
驚くべきことに、 Apache MySQL 、PHPは、Windowsへの移植も採用されており、UNIX系プラットフォームでなくても、Windowsのデスクトップ環境でも開発することが可能になりました。
こうしたことから、PHPによる Webアプリケーション開発は更に加速し、大手商用サイトで次々と採用され始め、Perlに代わる新しい開発言語として、ますますPHPが重要視され普及しています。

◇PHP制作環境の設定
□Linuxにおける制作環境
Linuxをお使いであれば、環境を作るのは比較的簡単です。すでに Apache モジュールは標準で実装されていますので、あとはPHPを手に入れてインストールするだけです。
ダウンロードしたファイルは、圧縮されたtarballファイルですので、作業用フォルダで解凍し展開します。ただし、展開されたファイルの中のconfigureスクリプトを実行して、コンパイルのための必要な環境設定を行う必要があります。
MySQL を利用したい場合にも、それを手に入れてインストールしてください。ほとんどのディストリビューションでは、最初からPHPを実装しているので、それを利用するといいでしょう。データベースを構築する場合には、強力なツールが各種用意されているので、これも利用するディストリビューションで確認してください。
PHPの開発は、X WindowのGUI環境で十分ですが、使いやすいテキストエディタが必要になります。標準で実装されているソフトウェアで十分に開発できます。
なお、Linux上のApacheの共有ライブラリをロードするために、httpd.confファイルの設定変更が必要ですので、マニュアルを参照してください。
□Windowsにおける制作環境
Windows環境では、何よりも Apache が必要ですので、Webサイトから入手して Cドライブ上に展開してインストールしてください。その後、PHPを導入します。 Apache のインストール法は、 Windowsの Apacheインストール を参照してください。
なお、PHPの実行ファイル(dllファイル)は、基本的にWindowsディレクトリのsystemフォルダなどにコピーしなければなりません。詳しくは、ダウンロードサイト、もしくはダウンロードしたファイルの中から「Readme」という文書がありますので、それに従ってインストールしてください。場合によっては、dllファイルの一部書き直しがあるかもしれません。正しくインストールされない場合には、実行環境が整備にされませんので注意してください。
どうしても分からないという方は、 WindowsのPHPインストール を参照していただければ、その詳細が理解できると思います。
MySQL データベースを利用したい場合にも、それを入手してインストールしてください。なお、データベースの開発は、DOSモード上で行います。
テキストエディタは、「メモ帳」でも作れないことはありませんが、あなたの WebサーバがUNIX系 (Linux や FreeBSD) であるならば、文字符号コードが「EUC-JP」となりますので、この符号が使えるエディタが必要になりますので入手してください。なお、サーバによっては「Shift_Jis」が使える場合もありますので確認してください。
ただし、ローカルのデスクトップ上で開発するのならば、少しの設定変更で「Shift_Jis」などが利用できます。
□Macintoshにおける制作環境
MacintoshのOS Xについて述べます。
OS Xでは、標準でApacheモジュールが実装されています。詳しい情報は「ヘルプ」を参照してください。
OS X上で動く PHPは、非常に数は少ないのですが、パッケージ用にコンパイルされたファイルがありますので手に入れてください。基本的には、ターミナルウィンドウを起動して、以下のようにタイプしてダウンロードします。
wget http://www.diax.ch/users/liyanage/software/macosx/libphp4.so.gz, ダウンロード後に、 gunzip libphp4.so.gz と入力、その後、 sudo apxs -i -a -n php4 libphp4.so と入力します。
PHPを動かすために、Apacheモジュール内のconfigureスクリプトを実行して最適化した環境を設定しなければなりません。これらについては、ダウンロード後の展開されたファイルの中に説明書がありますので参照してください。
関連サイト
http://www.php.net/
PHP開発チームのサイト。最新版PHPがダウンロードできる。(英語版)
http://www.Apache.org/
Apache開発元サイト。最新版のApacheと、PHPの2つが手に入る。(英語版)
http://www.MySQL.com/
MySQL開発元サイト。最新版のMySQLが手に入る。(英語版)
http://www.php.gr.jp/
日本PHPユーザの会。PHPに関する様々な情報が得られる。メーリングリストあり。
http://www.Apache.jp/
日本Apacheユーザの会。Apacheに関する様々な情報が得られる。ダウンロード可能
http://www.phpmac.com/
Macintosh OS X専用のPHPに関する情報が得られる。(英語)
◇PHPスクリプトの基本構造
□HTML埋め込み型スクリプト
PHPは基本的にHTML文書に埋め込む方法を採用しています。この手軽さがPHPの魅力でもあります。
具体的には、PHPで処理させたい場所で記述することになります。以下のサンプルコードを参照してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><html lang="ja"><head><meta http-equiv="Content-Type" content="text/html; charset=Shift_Jis"><title>PHP入門</title></head><body><p>今日は、<?php echo date("Y/m/d"); ?> です。</p></body></html>
このサンプルでお分かりのように、PHPの本体はHTML内に置かれます。具体的には、<?phpと、?>で囲まれた範囲がPHPの本体に当たります。つまり、PHPの処理命令を示すのが、<?php ~ ?>に囲まれたスクリプトそのものです。
このPHPスクリプトを分解すると以下のとおりです。
関数(引数);
極めてシンプルな構文になっています。こうした組み合わせによって、より実用性の高い Webアプリケーションを構築することが可能になっています。 echo()関数 は、その引数にあるデータを標準的な Webブラウザの画面に出力します。なお、 print()関数 も同じ役目をしますが、 echo()関数 よりも正確で確実といわれています。
□PHP作成のお約束
PHPを記述した文書の拡張子は、「.html」ではなく、「.php4」、あるいは、「.php」となります。一般的に多く利用されている拡張子は「.php」とされていますが、これはサーバ側のPHPのバージョンが異なる可能性があるので、安全を期すために「.php」が用いられています。当サイトで利用するサンプルも、この拡張子を採用しています。
Webサーバ(実際には、Apacheモジュール)は、文書が読み込まれた時、その拡張子を判断し、そこにあるスクリプトを解釈して実行するという仕組みでPHPを動作させます。
閲覧者が PHP文書のソース表示をした場合、そのソース表示にはPHPスクリプトは出力されません。あたかも、HTML文書がその内容を出力しているようなソース表示になります。
PHPの拡張子を持つ文書を作成する場合、その文字符号コードはApacheモジュールが解釈できる文字符号を用います。Webサーバの多くがUNIX系であることから、EUC文字符号が採用されています。ただし、Windowsサーバはその限りではありません。その場合には、Shift_Jisが利用できることでしょう。
日付を表示する PHPのサンプル
◇注意:
◇定数と変数
□定数
定数とは、格納された値が何らかの計算によって変わるということのない、「不変の値」を持ちます。つまり、格納された値は常に同じ値を保持しています。
PHPでは、定数を定義するために、define()関数を使い、定数名とその値を引数とします。以下が定数を定義するための公式です。
 define("定数名", "値");
define()関数とは、ある値を定数に定義するもので、定数以外の変数は、その値を変化させることができます。プログラム中に、ある値の中身を変えたくない場合には「定数」を定義しておくと便利です。
例えば人の名前や場所の名前などは変化するものではありません。そんな使い方の場合に定数を定義しておくようにします。
<?php define("banban", "ばんばん"); print(banban); // 定数banban の中身を表示する ?>
□変数
プログラム開発言語のほとんどで利用される「変数」とは、一時的にデータの「値」を格納し、計算結果などによってその値の内容が変化する性質を持ちます。
変数は、「代入演算子」によって値を変数に格納します。PHPでは、変数の行頭に「$」を設けて、それが変数であることを示します。
  $変数名 = 変数に代入する値
PHPでは、「変数の型」として、論理値や整数などの「スカラー型変数」や、配列やオブジェクトを扱う「複合型変数」、リソースやヌルコードを扱う「特殊な型」に大別されています。
以下に、変数の様々な「型」を紹介していますが、PHPでは特に変数のデータ型を宣言して使う必要がありません。こうした「曖昧さ」、「いい加減さ」が万人受けする言語でもあるということが言えるでしょう。
論理値 boolean
論理値は簡単に述べると、その変数に代入される値が「true」あるいは「false」のどちらかを扱う「真偽の値」を持つ変数です。
例えば、数値の値が 0 や 0.0 、何もセットされないヌルコードなどが論理値の「false」として扱われます。なお、実際の記述では、大文字と小文字を区別することはありません。
  $banban = true;
整数 integer
整数とは、浮動小数点以下の値を持たない、あるいは切り捨てられる値を持つ変数です。PHPで扱える一般的な整数の範囲は、-2,147,483,645 ~ 2,147,483,645になっており、小数点や指標を含まないものを整数と呼びます。
  $banban = 2000;
浮動小数点数 float
浮動少数点数とは、小数点以下の数値を持った型になります。PHPでは、14桁の数値を扱えることから、広く科学技術計算などに利用されます。
  $banban = 3.14159265;
文字列 string
文字列変数とは、まさに文字列(テキスト)を値とした変数です。英字や漢字、かななどを扱うことができる非常に応用範囲の広い変数となっています。
代入できる文字列の長さに制限がないのもPHPの特徴です。文字列を代入する場合には、シングルコーティション「 ' 」、あるいはダブルコーティション「 " 」で囲みます。
  $banban = "ばんばんは当サイトの作者のハンドルネームです";
なお、コメントはスラッシュ「 / 」を2つ続けて「 // 」とすることで、コメントとして解釈され無視されます。ただし、改行すると、コメントが終了します。
□変数のデータ型変換
PHPでは、厳密な変数の型変換は行われません。そのため、最低限知っておかなければならない変数の変換について述べます。
ダブルコーティション、あるいはシングルコーティションで囲まれた変数は、それが例え数値であっても文字列変数となります。それに反して、何も囲まなければ数値変数になります。ただし、文字列を何も囲まなければエラーとなります。
面白いことに、変数が文字型変あっても、先頭に来る値が数値の場合、妙な結果を提示します。
<?php  $a = 100;  $b = "123はいちにぃさん";  $c = $a + $b; print($c); ?>
このスクリプトの出力結果は以下のとおりです。 数値変数と文字列変数を加算した結果を Mozillaブラウザで出力した画像。答えは 223になる。
数値変数$aに、文字列変数$bに代入される値の先頭の文字列を数値として解釈し、100+123=223という演算結果を出力してしまいます。
PHPだけに見られるデータ型変換が行われた結果を垣間見ることができます。非常に面白い言語であることがご理解できることでしょう。
□変数の自動生成
PHPは、時としてミスに対して寛容なところがあります。しかし、困ったことにミスに気がつかない場合があり、逆にデバックできなくなる傾向もあります。
例えば、以下の構文のとおり、
<?php $banban = "ばんばん"; print($banbna); ?>
この構文の記述ミスに気がつきましたか?
変数$banbanに値を代入してから、その結果を表示しようとしていますが、その時の変数の記述にミスタイプがあります。「$banban」→「$ban bna
PHPでは、このような変数のミスタイプをエラーとして何も表示されません。つまり、定義していない変数を自動的に生成され、作者が単純なタイプミスに気がつかない側面を持っています。
変数の命名規則
PHPでは、変数の頭にドル記号「 $ 」を付けなくてはなりません。厳密な変数の型変換は行われませんので、それが文字列データであっても、数値データであっても、基本的な変数の書き方は同じです。
PHPの変数名は、先頭に数字があってはいけません。基本的には、大文字と小文字を区別しませんが、対象によって異なる場合があります。
PHPで利用できる命名の文字 a ~ z A ~ Z 0 ~ 9 (先頭には利用できない) 0x7F ~ 0xFF までのコードを持つ文字 _ (アンダーバー)
この規則に従えば、日本語も変数として扱うことができます。
◇配列
□配列array
JavaScriptやPerl言語などで見られる配列と同じように、PHPでも配列を設定することができます。例えば最も簡単な配列方法は、<?php $banban[] = "HTML"; $banban[] = "XHTML"; $banban[] = "XML"; ?>
このように[ ]を使って設定すれば、$banban[0]には、「HTML」という文字列が代入され、$banban[1]では、「XHTML」が代入されます。
こうした配列の仕方もあるのですが、配列すべき値が多くなると記述するのも大変です。(配列のインデックスの先頭は常に 「0」 になります。)
□array()関数
複数の値(インデックス)を1つの変数に格納する場合、 array()関数 を使うことで、簡単に配列を設定することができます。<?php $banban = array("HTML", "XHTML", "XML", "XSLT", "RSS"); ?>
こうすることで、任意の値を取ることができます。例えば、「XHTML」という値が欲しいときには、$banban[1]とすればいいのです。
<?php $banban = array("HTML", "XHTML", "XML", "XSLT", "RSS"); print($banban[1]); ?>
スクリプトの実行結果は以下のとおりです。 配列の値から1つ取り出して表示させたMozillaブラウザの画像
配列の中から1つだけ値を取り出して表示させています。
配列にはいくつでもどのような型でも取り込むことができ、スクリプトを簡素化します。配列された値は、必要なときに必要な分を取り出して、計算や他のスクリプトに応用することが可能です。
explode()関数
インデックスの区切り文字を基準として配列するのが、explode()関数です。これは、インデックスの文字列の各項目として変数に格納されます。
<?php $banban = explode(",", "HTML,XHTML,XML,XSLT,RSS"); print($banban[3]); ?>
サンプルコードを見てお分かりのとおり、インデックスの文字列がカンマで区切られており、その区切り文字を先頭で指定しています。そうすることによって、1つの文字列内で、インデックスをいくつでも設定することができます。
スクリプトの実行結果は以下のとおりです。 expode()関数の配列の値から1つ取り出して表示させたMozillaブラウザの画像
expode()関数で指定された値の4番目のインデックスを取り出して表示させているサンプルです。
一般的には、array()関数を使うことが多いのですが、expode()関数も便利に使えます。なお、区切り文字は任意に指定することが可能です。
連想配列
ここまで文字列を中心として配列について説明してきました。インデックスが文字列の配列の場合を「連想配列」と呼びます。もちろん、配列には数値でも可能です。
連想配列では、インデックスに文字列を割り当てているために、ループを利用する場合、普通の配列のように添え字を使ってその値を参照することができません。そのため、 list() と、 each()関数 を使えば、同じように機能することができます。
<?php $fruit = array("Apple" => "りんご", "Orange" => "みかん", "Grape" => "ぶどう"); while(list ($key, $val) = each($fruit)) { print ("インデックスの $key は、$val です<br>\n"); }?>
このスクリプトでは、each()関数を使って、連想配列$fruitの値をサブ配列で返しています。list()関数で、変数$keyと$valに出力する値を割り当てています。ここでのキーは=>を使っています。
◇演算子
□基本的な演算子
一言で演算子といっても、多種多様です。PHPでは簡単な足し算や引き算などのような加減乗除の演算子、あるいは比較演算子、論理演算子など、利用できる多く演算子が用意されています。
算術演算子
加減乗除とは、最も基本的で簡単な足し算や引き算、掛け算、割り算を行う演算子です。特に足し算は数値だけでなく、文字列を結合するにも利用されています。
演算子 意味 例示 機能
+ 加算 17 + 5 2つ以上の値の足し算を行う
- 減算 17 - 5 2つ以上の値の引き算を行う
* 乗算 17 * 5 2つ以上の値の掛け算を行う
/ 乗算 17 / 5 2つ以上の値の割り算を行う
% 剰余 17 % 5 割り算したときの割り切れなかった数を求める

これらの演算子 を使ったサンプルは以下のとおりです。<?php $samp = 17 + 5; echo "17 + 5 = $samp<br>\n"; $samp = 17 - 5; echo "17 - 5 = $samp<br>\n"; $samp = 17 * 5; echo "17 * 5 = $samp<br>\n"; $samp = 17 / 5; echo "17 / 5 = $samp<br>\n"; $samp = 17 % 5; echo "17 % 5 = $samp<br>\n";?>
2つの値を「ある条件」で比較し、条件にマッチすれば「true」を、条件が成立しない場合には、「false」を返します。
その「ある条件」を示すのが比較演算子です。条件分岐などの構文で利用されます。
演算子 意味 例示 機能
== 等しい $x == 15 変数$xと 15は等しい
< 小さい $x < 15 変数$xは 15より小さい
> 大きい $x > 15 変数$xは 15より大きい
<= 同じか小さい $x <= 15 変数$xは 15より同じ、または小さい
>= 同じか大きい $x >= 15 変数$xは 15より同じ、または大きい
!= 等しくない $x != 15 変数$xは 15と等しくない
<> 等しくない $x <> 15 変数$xは 15と等しくない

比較演算子 を使ったサンプルコードは以下のとおりです。
<?php $x = 15; echo "<p>変数\$x の代入された値は 15です。</p>\n"; if($x == 15) echo "\$x の値は 15 に等しい<br>\n"; if($x < 10) echo "\$x の値は 10 より大きい<br>\n"; if($x > 20) echo "\$x の値は 20 より小さい<br>\n"; if($x <= 10) echo "\$x の値は 10 より大きいか等しい<br>\n"; if($x <= 20) echo "\$x の値は 20 より小さいか等しい<br>\n"; if($x != 10) echo "\$x の値は 10 と等しくない<br>\n"; if($x <> 10) echo "\$x の値は 10 と等しくない";?>
代入演算子
一般的に、算数の式を記述するとき、15 + 5 = 20と表現します。ここで記述されるイコール「=」は、左辺の計算結果がとその答えが等しいという意味があります。
ところがPHPに限らず、ほとんどのプログラム言語では「代入する」という考え方が一般的です。変数や配列などで定義される「ある値」を右辺に記述し、左辺に代入するという基本的な約束があります。
演算子 意味 例示 機能
= 代入 $x = 15 左辺$xに右辺 15という値を代入し格納する
+= 加算代入 $x += 15 変数$xに右辺 15という値を加算して代入する
.= 連結代入 $x .= $y 変数$xに変数$yの値を連結して代入する
++ 加算代入 $x ++ 変数$xの値に1を加算して代入する
-- 減算代入 $x -- 変数$xの値に1を減算して代入する

変数に代入される値は数値だけでなく、文字列も代入することができ、その文字数に制限はありません。ただし、文字列を変数に代入する場合には、ダブルコーテーション、あるいはシングルコーテーションで囲まなければなりません。
論理演算子
PHPのプログラムでは、幾つかの条件式が登場します。その条件式の中でも演算子が用いられ、一定の条件を作成します。その条件市の中で記述される演算子を「論理演算子」と呼びます。
論理演算子を組み立てることで、より複雑な条件式を結合することも可能です。論理演算子によって返される値は「true」、あるいは「false」になります。
演算子 意味 例示 機能
&& 論理積 $x && $y 2つの値が成り立つとき
|| 論理和 $x || $y 2つの値の片方または両方が成り立つとき
and 論理積 $x and $y 2つの値が成り立つとき
or 論理和 $x or $y 2つの値の片方または両方が成り立つとき
xor 論理和 $x or $y 2つの値の片方が成り立ち、両方が成り立たないとき
! 否定 !$x 値が成り立たないとき

論理積、論理和は2通りありますが、論理演算子の優先順位として、&&、||の方が高くなっています。スクリプト作成時には注意してください。
◇◇ 文字列

文字列とは、まさに普通に読み書きする文字の集合(テキスト)を意味します。PHPでは、文字列に関する関数があらかじめ用意され、こうした関数を利用することで、置換えや分割、結合などを行います。


□文字列データ
文字列は、ダブルコーテーション、シングルコーテーション、あるいはヒアドキュメントという3つの形で定義されます。
ダブルコーテーション  "初心者のための PHP入門"シングルコーテーション '初心者のための PHP入門'ヒアドキュメント    <<<初心者のための PHP入門
ヒアドキュメントは、先頭にキーワードを指定し、次にそのキーワードが出てくるまでの複数行の文字列を改行文字を含めて、1つの文字列として扱います。あまり一般的ではないので、通常は、ダブルおよびシングルコーテーションを用います。
$subtitle = "初心者のための PHP入門\n";
文字列の中で「\n」とあるのは「改行」を意味し、本来ならば「バックスラッシュ」を書きたいところですが、残念ながらコンピュータから入力できないため、「\」と書きました。
実際に表示されるときに、改行されるという保証はありません。念のため。
なお、「\」を使った記述は、ダブルコーテションの中以外には使えません。シングルコーテーションで囲む場合には、「\\」と2つ続けて記述します。
文字列の中でダブルコーテーションなどを表示したい場合には「\」をつけてエスケープしなければなりません。
$subtitle = "初心者のための \"PHP入門\"\n";
以下が、エスケープ文字「\」を利用してダブルコーテーションを表示させた Webブラウザの出力結果です。
エスケープ文字バックシュラッシュを使って引用符を表現した Mozillaブラウザの画像
「PHP入門」の前後に引用符としてダブルコーテーションが表示されます。
エスケープ文字がない場合には、エラーとして画面に表示されます。
□エスケープすべき文字
PHPでは、文字列データを表現するため、文字列に含まれる文字種の中にエスケープしなければならないものがあります。この場合、その文字の先頭で\を記述します。
エスケープ文字種とその意味
文字種 意味
' シングルコーテーション
" ダブルコーテーション
\ バックスラッシュ
t タブ記号
n 改行記号
$ ドル記号
r キャリッジリターン

□文字列データの連結
変数に代入された文字列は、他の変数に代入された文字列を結合して、1つの文字列として扱うことが可能です。その場合、文字列変数を、ピリオド「 . 」、あるいはプラス「 + 」などの記号で結合します。
<?php $beginner = "初心者のための"; $webpage = "ホームページ作り"; print($beginner. $webpage);?>
上記スクリプトの実行結果は以下のとおりです。
エスケープ文字バックシュラッシュを使って引用符を表現した Mozillaブラウザの画像
2つの文字列変数を1つの文字列として変数に格納し、その結果を出力しています。連結する文字列変数の数に制限はありません。いくつでも結合することが可能です。
当講座では、このような文字列の連結には、基本的に「ピリオド」を使って解説します。
文字列データの置換
文字列データから、ある文字列を取り出して異なる別の文字列に変換することを「文字列の置換」と呼びます。PHPでは、こうした一連の置換作業を、str_replace()関数を利用します。
str_replace()関数は、
str_replace("置換対象の文字列","置換する文字列","最初の文字列");
それぞれの文字列は変数でも可能です。以下はそのサンプルコードです。
<?php $beginner = "初心者のためのホームページ作り"; $replace = "ホームページ作り"; $scriptphp = "PHP入門"; $word = str_replace($replace, $scriptphp, $beginner); print($word);?>
上記スクリプトの実行結果は以下のとおりです。
str_replace()関数を使って特定の文字を置き換えて表現した Mozillaブラウザの画像
ご覧のように「ホームページ作り」という文字列だけを抜き取って「PHP入門」という異なる文字列に置換えた結果を表わしています。
文字列データを扱う「関数」はこれ以外に、あらかじめ70あまりが定義されています。このページでそれら全部を紹介することにはやや無理がありますので、関数リファレンスを参照してください。
◇ループ

スクリプトの中で、同じ処理を繰り返す「ループ」は単独で利用されたり、、次節の「条件分岐」と併用して利用されることもあります。ループはPHPスクリプト中で、非常に多く利用される「制御構文」の1つです。


□ループ ~ 繰り返し処理
PHPでは、ループを構成する4種類の制御構文が用意されています。
while構文
ループを制御する最もシンプルな構文が「while」です。whileは、その繰り返しのコードを実行する前に条件式を評価し、その式が満たされればループを抜けます。同時に、その式が最初から満たさなければ、ループを実行することがありません。
以下は、while構文の基本的な形です。
while (式) { 処理スクリプト }
while 構文は、if構文に似ており、式を評価してから、中カッコ[ ~ ]のブロックを実行します。言い換えれば、式にある条件を満たすことができなければ、ループを実行させることができません。
<?php $a = 0; $lectur = array("HTML","XHTML","XML","JavaScript","PHP"); while($a < 4) { print($lectur[$a]). "&#160;\n"; $a++; }?>
このwhile構文の条件式は、変数$aの値が4を超えたときにループから抜けるように設定されています。このスクリプトでは配列で定義された5つのインデックスのうち、4つまでを Webブラウザに出力しています。
for構文
基本的には、while構文と同じ繰り返し処理を行いますが、式の内容が異なります。for (初期値式; 条件式; 増減式) { 処理スクリプト  }
この構文は、JavaScriptのfor構文とまったく同じ公式です。初期値式には、ループを繰り返す前に必ず1回だけ実行され、その値に基づいて条件式で評価され、その値が「true」ならば、ブロック内の処理スクリプトを実行し、処理が終わったら増減式で初期値式の値を増やしたり減らしたりします。
つまり 、ループに入る前に初期値式を実行し、条件式で評価します。評価した値が条件に合えば処理を行い、増減式を実行してから条件式に戻ります。条件がマッチしない場合には、ループを実行しません。
<?php for($a = 0; $a < 4; $a++) { $lectur = array("HTML","XHTML","XML","JavaScript","PHP"); print($lectur[$a]). "&#160;\n"; }?>
このfor構文では、初期値として変数$aに、1をセットしています。条件式では、$aが4を超えているかどうかを評価し、4以内であれば「true」と判断して、処理のスクリプトを実行します。処理後、$aの値に1を加えて、条件式を繰り返します。
do ~ while構文
while、for構文は、式を最初に評価してから処理スクリプトを繰り返すループですが、do~while構文は、処理を最初に行ってから条件式を評価するという構文です。do { 処理スクリプト  } while(式);
この構文では 、処理スクリプトは条件に関わらず最低1回は実行されることを理解できることでしょう。最初に処理したい場合のループに向いた制御構文です。
<?php $a = 0; $lectur = array("HTML","XHTML","XML","JavaScript","PHP"); do { print($lectur[$a]). "&#160;\n"; $a++; } while($a < 4);?>
この PHPスクリプトでは、最初に初期値となる変数と配列を用意し、それをdo文で解釈して実行しています。処理が終わったら変数の増減式地を設定します。
ここでは、初期値として設定された変数$aに 1を加えています。その後、while文によって変数の値を評価します。
もし、このような増減式を設定しなければ、非常に危険な「無限ループ」に陥り、閲覧者のリソースを著しく損なう結果となりますので、do~while構文を使う場合には、その点に十分注意してください。
foreach構文
foreach構文は、PHP4 から実装された比較的新しい制御構文です。このループ制御では、指定した配列の要素を1つづつ抜き取って処理します。foreach( 配列 as $key => $value) { 処理スクリプト  }
少し 分かりづらいと思いますが、配列を設定する場合に、$keyによって設定されたキーワードと共に格納されるインデックスと、$valueに格納されるインデックスとグループ化します。例えば、
<?php $a = array("Apple" => "りんご", "Orange" => "みかん", "Grape" => "ぶどう"); foreach( $a as $key => $value) { print("$key は、$value<br>\n"); }?>
変数$aに格納された配列は、キーワードが「=>」によって2つの値を対にしてそれぞれを取り込んでいます。
foreach構文では、そのキーワードをもとにしてそれぞれの値を、変数$key、$valueにループしながら変換します。ループは、取り込まれたインデックスの数だけ行われます。
break
ループを途中で抜けたい場合には、break文を使います。条件式だけでは指定できないループの脱出には便利な機能を持っています。
ただし、break文は、foreach以外のループ制御構文に利用できます。foreach構文では不可となります。
<?php for($a = 0; $a < 4; $a++) { $lectur = array("HTML","XHTML","XML","JavaScript","PHP"); print($lectur[$a]). "&#160;\n"; if($a == 3) { print("ループを抜けます"); break; } }?>
◇条件分岐
if構文
条件分岐の制御構文で代表的なのが、if構文です。if構文では、最初に式を評価し、その条件を判断して処理スクリプトを実行します。if(条件式) { 条件が満たされたときの処理スクリプト  }
このように、与えられた条件式の「真偽」を評価して、その結果によって剃りさせたいスクリプトに誘導します。
<?php $a = 10; if($a > 5) { print("変数\$a は、5 よりも大きい"); }?>
上記スクリプトの実行結果は以下のとおりです。
if構文を使った条件分岐の実行結果を Mozillaブラウザで出力した画像
変数$aの値を条件式で評価して、その結果が「true」と判断され、処理スクリプトを実行した結果です。
もし、条件式で「false」と評価された場合、ブロック内の処理スクリプトは実行されません。しかしその場合、閲覧者がその結果を知ることができません。
else文
if構文の条件式が「false」を返したとき、別の処理スクリプトへ誘導するためにelse文を使います。
elseを簡単に説明すると、もし~ならば、~であるが、そうでない場合は~である、というところの「そうでない場合」を指定するものです。
<?php $a = 3; if($a > 5) { print("変数\$a は、5 よりも大きい"); } else { print("変数\$a は、5 よりも小さい");?>
else文は、入れ子にしてより細かな条件設定を行うことができます。
また、elsif文を使って入れ子にすることができます。閲覧者の反応に答えるため、さらに細かな処理スクリプトを書くことが可能になります。
<?php $a = 3; if($a > 5) { print("変数\$a は、5 よりも大きい"); } elseif($a >10) {       // elseif文 print("変数\$a は、10よりも大きい"); } else { print("変数\$a は、5 よりも小さい");?>
switch構文
switch文は、変数の値に応じて条件分岐する制御構文で、case文と共に利用します。switch文の基本的な書式は以下のとおりです。switch(変数または式) { case "値1": 変数の値が、値1のときに処理するスクリプト   break; case "値2": 変数の値が、値2のときに処理するスクリプト   break; case "値3": 変数の値が、値3のときに処理するスクリプト   break; default: 変数の値がいずれの case の値と一致しなかった場合のスクリプト }
switch文は同じ変数を繰り返して評価するための条件を、その引数に設定することで、効率的で便利な条件分岐が行えます。記述の際に間違えやすいのは、コロンとセミコロンです。注意しましょう。
条件がマッチしたときに、処理を行います。なお、処理が終わったらbreak文で、構文から抜け出すように明示しておくことが大切です。caseは任意にいくらでも設定することが可能なため、非常に細かな条件を設定することが可能です。
<?php $age = 20; switch($age) { case "15": print("勉強に励んでください");    break; case "20": print("若くてうらやましいです"); break; case 30: print("これから人生の本番です"); break;  default: print("人生は悩み多きものです"); }
このスクリプトでは、あらかじめ条件に用いる値を「20」にしていますが、switch構文は閲覧者からの入力によってインタラクティブに反応する構文が書けます。以下は、このスクリプトの実行結果です。
switch構文を使った条件分岐の実行結果を Mozillaブラウザで出力した画像
swithcで指定した値が一致したcase文の処理スクリプトによって、Webブラウザに結果を出力しています。ここでは、case 20:が選択されています。
条件分岐のそれぞれの構文は、複雑なスクリプトを作成する意味でも欠かすことができません。ある条件のもとに出力させるという手法は、様々なシーンで利用されるに違いありません。
◇ユーザ定義関数
なお、PHPにあらかじめ組み込まれている関数については、「関数リファレンス」を参照してください。
この節では、作者が自ら関数を定義する「ユーザ定義関数」について解説します。
関数定義
プログラムとは、始まり → 処理 → 終わり、という一連の流れに沿って記述します。コンピュータは、プログラムの1行ずつを先頭から順に解釈して処理していきます。プログラムを利用するとき、操作する人によっては、手順に従わない様々な操作や入力をします。その際、それらを処理するために膨大な量のプログラムを組むのは、コストや時間ばかりかかり、メンテナンスしにくいものとなってしまいます。
そうした何があるか分からない場合に備えて、別途プログラムを組むことをサブルーチンと呼びます。必要に応じて、サブルーチンのプログラムを呼び出す手法は、どのプログラム言語でも利用されています。いうなれば、プログラムを組むということは、サブルーチンの集合を作るようなものです。
前置きが長くなりましたが、そうしたサブルーチンを関数と呼び、あらかじめ小さなプログラムを1つにまとめて、必要に応じて呼び出すというものです。そうした関数を定義して利用することを、「ユーザ定義関数」と呼びます。
関数を定義する function
関数とは、前述したとおり1つのかたまりとして処理するためのプログラムです。閲覧者からの操作や入力応じて、決められた関数を使って結果を返すなどに使われます。
関数を定義するために、functionというステートメントによって定義します。
function 関数名() {  処理に必要なプログラム  }
まるでJavaScriptの定義関数と同じです。関数名は、変数の命名規則と同じです。また関数名は、大文字と小文字を区別しません。aとAは同じに扱います。
functionステートメントの後には半角のスペースが必ず必要です。関数名には「引数」を指定する括弧「( )」を添えます。引数のパラメータが必要ない場合には空となります。関数の定義後には、セミコロンは必要ありません。関数のための処理スクリプトは、ブロック内で配置されます。
関数からの戻り値 return
関数のスクリプトで処理され、その値が必要な場合にはreturnステートメントを使って、値を返します。これを戻り値(返し値)と呼びます。function samp() {   return(戻り値); }
戻り値を利用する場合には、その戻り値をそのまま利用することができます。
function strong($text) { return("<em>$text</em>\n"); } print(strong("この文字は強調されます"));
ここでは、strong関数を定義して、出力するテキストの文字を強調させるために、戻り値を利用しています。以下がその実行結果です。
関数の戻り値を使った実行結果を Mozillaブラウザで出力した画像
戻り値として定義されたHTMLのem要素によって、関数が実行された内容の文字列を強調しています。このような使い方さえも可能です。
このスクリプトでは、関数の引数にパラメータとして変数を利用しています。関数の引数として、変数や値の入力を受け取ることができます。ここでは、戻り値としてHTMLの構文を受け取っています。
引数の値渡し
関数に値を渡す場合に、引数を使って渡します。関数に対して引数として与えられた値は、「値渡し」が行われます。値渡しは、関数にデータを渡すときに、値そのものを渡します。
引数には、数値、変数、配列などを指定することができます。また引数は、カンマで区切ることにより、複数指定することもできます。
非常に面白いのは 、関数に渡された引数を変更しても、影響を受けるのは関数の中だけにとどめられます。つまり、変数を引数に値渡しされたとき、変数の値そのものは関数の中だけで変化しますが、関数の外ではまったく変化しません。
function num($a) { $a = ($a +2) * $a; return $a; } $b = 5; print("\$b の初期値は". $b. " です<br>\n"); $c = num($b); print("関数に渡された \$b の値は". $b. " です<br>\n"); print("関数の実行結果は ".$c. " です");
引数の参照渡し
引数にアンパサンド「&」をつけると、「参照渡し」(リファレンス渡しとも言う)となり、引数として渡された変数自体の値を変化させることができます。つまり、関数の外にある変数を引数として渡された場合、結果としてその変数の値が変化することになります。
function num(&$a) { $a = ($a +2) * $a; return $a; } $b = 5; print("\$b の初期値は". $b. " です<br>\n"); $c = num($b); print("関数に渡された \$b の値は". $b. " です<br>\n"); print("関数の実行結果は ".$c. " です");
このスクリプトでは、先ほどのサンプルと比べてほとんど何も変るところがありません。唯一、関数の引数に示されたパラメータに「&」が付いているだけです。
引数のデフォルト値
引数の値を最初から指定してしまう方法を「デフォルト値」の指定です。引数のパラメータにイコール「 = 」という代入演算子を利用してデフォルト値を設定します。function 関数名(変数, デフォルト値)
この設定を先ほどのサンプルに当てはめると、
function num($a = 5) { $a = ($a +2) * $a; return $a; }
こうすることで戻り値には、計算結果の「35」が格納されます。初めから引数を指定してしまう方法は随所で利用されています。デフォルト値は、カンマで区切って複数設定することができます。
◇クラスとオブジェクト
オブジェクト指向とは
従来のプログラミングでは、処理の「手続き」を主体としていますが、オブジェクト指向は処理を「オブジェクト」という手法で用いられます。

手続き型プログラムと、オブジェクト方プログラムを対比させている図。手続きではそれぞれの処理プログラムが必要


手続き型プログラミングでは、ショッピングの際に商品を選んで決済までの手順で動作させていますが、更に違う商品や異なる手続きが必要な場合に、そのたびにプログラミングしなくてはなりません。
ところが、オブジェクト指向では、パラメータの値を変えるだけで、その後の処理はあらかじめ決められたメソッド(機能)を利用するだけで済みます。こうしたパラメータやメソッドはまるで1つの関数のように見えます。
もっと平たく言い換えれば、私たちが車を運転するときに、車に収められているエンジンとかトランスミッションとか、デファレンシャルなどというような機能や仕組みを知らなくても、キーをひねれば動かすことができます。つまり、オブジェクト指向とは、そういった一連の機能や仕組みを提供する「モノ」です。
こうしたオブジェクトを作成するためには、「クラス」と呼ばれるある種のテンプレート(雛形)を定義しなければなりません。
クラスの定義
クラスを定義するためには、メンバ変数の宣言とメソッドの定義が含まれなければなりません。
メンバ変数とは、クラスで表現したいオブジェクトの「パラメータ」を格納するための変数となります。上記の図でいえば、「商品」や「金額」にあたります。
メソッドとは、機能を実現するための関数にあたります。この場合、メソッドは一般の関数とは異なり、あくまでクラスのオブジェクトの中でのみ有効になります。
class Shopping { var $item = "コンピュータ"; var $price = 99800; // ここまでメンバ変数の設定 function getTotal() { $tax = $this->price * 0.05; return $this->price + $tax; } // ここまでメソッドの定義 }
コメントにもあるように、このクラスでは、メンバ変数とメソッドを定義しています。当たり前ですが、メンバ変数のパラメータやメソッドは複数設定することができます。
クラスで定義した機能を利用するために、「オブジェクト」を生成しなければなりません。
オブジェクトの生成
定義したクラスを利用するためにはnewステートメントを使って、オブジェクトを生成しなければなりません。$変数 = new クラス名();
この1行によって、指定した変数にクラスから生成されたオブジェクトが格納されます。また、オブジェクトが持っているメンバ変数やメソッドを取り込むためには、以下のように記述します。
$newShopping = new Shopping(); $item = $newShopping->item
メンバ変数に格納されている$itemでは、もともと「コンピュータ」が定義されていましたが、このようにして、その内容を随時変更することができます。さらに決済に必要なメソッドを取り出す場合にも、以下のように設定します。
class Shopping { var $item = "コンピュータ"; var $price = 99800; function getTotal() { $tax = $this->price * 0.05; return $this->price + $tax; // 税込価格の設定 } } $result = new Shopping(); $item = $result->item; print("$item の会計は".$result->getTotal()."円になります\n");
クラスを利用するオブジェクトでは 、メンバ関数で値が設定されていても、後でその値を変更することが可能です。つまり、閲覧者からの入力によって、簡単に商品や価格などを変更できる利点があります。
◇日付と時間
PHPで扱える暦
PHPで日付を扱うとき、その基本となる日数の算出に必要な「暦」が幾つか存在しています。どれを基本の暦にするのかは、作者の感性に依ります。
世界協定時 UTC
世界中の時刻を合わせるための公式な時刻を定めているのが世界協定時です。グリニッジ標準時は、天文学を主体として時間を定めていますが、世界標準時は、セシウム原子の振動を基準にして定められている物理学的な時刻です。
JavaScriptでも利用されていますが、PHPでも世界協定時を利用することは可能です。また、世界協定時を使うための関数として、time()、date()、getdate()が定義されており、世界各地のローカルタイムを参照できるようになります。なお、日本時間は、世界協定時から9時間加えることで参照できます。
グリニッジ標準時 GMT
イギリスのグリニッジ天文台での天体観測を元に決められる時間で、少し前までは、この時間を世界共通の標準時間と決められた経緯がありましたが、現在はUTCにその座を譲る格好となっています。
両者はほとんど同じですが、天文を主体としたグリニッジ時は、海の潮汐運動がネックとなり、地球の自転周期は年々長くなっているため、時間の経過と共にずれが生じる矛盾が指摘されています。
Windowsマシンでは、このグリニッジ標準時に、ローカル時間との差分を計算して時刻を示しています。日本時間はグリニッジ標準時から、9時間加えることで求められます。
UNIX時
サーバ・コンピュータの標準的な OS であるUNIXでは、1970年1月1日午前0時00分00秒からの経過秒数を基準とした時間で、UNIXでは 31536000 ( =365× 24× 60× 60 ) と表現されます。
UNIX時は、プログラムとの相性がよいという唯一の長所がありますが、桁数が多く、見た目に全く理解できない欠点があります。
グレオリオ暦
ローマ教皇グレゴリオ13世は、天文学者アロイシウス・リリウスや数学者クリストフェル・クラヴィウスらの勧めによって 1582年にグレゴリオ暦を作成しました。グレゴリオ暦は現在世界各国で使われている暦法で、それ以前に使用されていたユリウス暦に修正を加えた太陽暦の一種であるといわれています。
これは、ユリウス暦に 400の倍数の年は閏年を設けないという規則を追加し、400年に3日減らすことで平均年を 365.2425日としてより正確な暦が作成されました。
PHPでは、関数JDToGregorian()、GregorianToJD()を使うことにより、ユリウス日との相互運用が可能となっています。
フランス革命暦
フランス革命の後に始まった暦で、1ヶ月を30日、1週間を10日、1日を10時間、1時間を100分として、年末に5日間の閏日を持っています。フランス革命後、ナポレオンによって廃止される 1806年まで使われた暦。
PHPでは、関数JDToFrench()、FrenchToJD()を使うことにより、ユリウス日との相互運用が可能となっています。
ユダヤ暦
創生紀元年 (西暦紀元前3761年) から始まり、19で割った余りが 0、3、6、8、11、14、17 になる年を閏年として、基本的に月の満ち欠けで計算される暦です。
関数JDToJewish()、JewishToJD()を使うことにより、ユリウス日との相互運用が可能となっています。
ユリウス暦
ご存知ジュリアス・シーザー(ユリウス・カエサル)が、紀元前46年に制定した暦で、1年を原則として 365.25日とし、4年に1度の閏年に、2月に1日を加えて 366日とすることで、より正確な暦となりました。ただし、正確な太陽年とは4年に約44分の誤差があるため、後のグレゴリオ暦に取って代わることになりました。
ユリウス日
ユリウス日とは、JJ.Scaligerという人が、月のない日付を考案しました。基本的には、紀元前4713年1月1日12時から数えた日付を表わします。
PHPでは、それぞれの暦を相互運用するとき、このユリウス日を必ず使います。ユリウス日の日付を参照するために関数が幾つか用意され、それに基づいて目的の日付を取得します。なお、ユリウス日とユリウス暦はまったく異なることに注意してください。
関数 意味
unixtojd() UNIX時間(1790年1月1日からの秒数)をユリウス日に変換する
jdtounix() ユリウス日を UNIX時間に変換する
FrenchToJD() フランス革命暦(共和暦)をユリウス日に変換する
JDToFrench() ユリウス日をフランス革命暦に変換する
JDToJulian() ユリウス日をユリウス暦に変換する
JulianToJD() ユリウス暦をユリウス日に変換する
JDToJewish() ユリウス日をユダヤ暦に変換する
JewishToJD ユダヤ暦をユリウス日に変換する

日付と時間を扱う関数
PHPで Webアプリケーションを開発する際、日付と時間は大変重要になります。この節では、一般的に利用されている代表的な時間を扱う関数について解説します。
今の時間を参照する  getdate()関数
ローカル時間(局地的な時間の意味で、世界各国のそれぞれの地域の時間を表す)を参照するには、getdate()関数を使います。この関数には連想配列として、以下のようなインデックスが定義されています。

こうした連想配列を組み合わせて、現在の日付を参照します。
<?php $today = getdate(); print("$today[year]年$today[mon]月$today[mday]日<br>\n"); print("今年1月1日から $today[yday]日目です<br>\n"); print("$today[weekday] $today[month]/$today[mday]/$today[year]");?>
日付表現のフォーマット と時間の参照 date()関数
getdate()関数では、連想配列に参照した日付の表現方法を示しますが、もっと自由なフォーマットで表現したい場合には、date()関数を使います。
date()関数では、日付を参照するだけでなく、ローカル時間の時刻も合わせて参照することができます。ただし、date()関数の引数がない場合はその限りではありませんが、サーバによっては引数を指定しないと「警告」が出る場合もあります。
フォーマットを定義する引数は、以下のとおりです。

date()関数の引数に、以上のような値を定義することで、様々な形のフォーマットを提供し、表現します。
<?php $today = date("Y/m/d l H:i:s"); print($today);?>
◇画像処理
この節では、簡単な画像を描画する関数とその使い方について解説します。詳しい関数については、関数リファレンスのイメージ関数を参照してください。
PHPで扱える画像形式
PHPで利用できる代表的な画像形式は、GIF、JPEG、PNGの3つです。なお、生成できる画像形式は、GIF形式のみPHPバージョン 1.6 以前でなければ扱うことができません。現在は 4.3 が主流になっていますので、GIF形式の画像を生成することができません。
この節では、ロイヤリティが必要ないPNG形式を中心に解説します。ただし、2004年6月以降になれば、GIF形式がロイヤリティ・フリーで利用できるようになりますので、新しいバージョン(近々PHP5.0のリリースが予定されている)では、利用できるのではないかと予想しています。
(追記:2004年3月にPHP5.0がリリースされました。)
画像を作る
PHPで画像を生成する場合、最初にレンダリングする画像の領域を設定します。また、利用する色などもあらかじめ設定し、その後、画像の形を指定します。
<?phpheader("content-type: image/png");$image = imagecreate(100,100);$back = imagecolorallocate($image, 0, 0, 0);$red = imagecolorallocate($image, 255, 0, 0)imagepolygon( $image, array( 10, 80, 80,80, 80, 10 ), 3, $red ); imagepng($image); imagedestroy($image);?>
このPHP文書そのものが画像の扱いとなります。これをHTML文書から読み込むために、img要素を使います。
PHP文書から出力した画像を表示しています
左の画像は、上記のスクリプトを記述した外部PHP文書を読み込ませてレンダリングしたものです。読み込みには、説明したとおり、img要素を使いました。
□イメージ関数
上記スクリプトでは、画像の生成に関数を利用しています。
画像の描画領域はimagecreate()関数使い、横幅と高さを指定します。描画する色の指定にはimagecolorallocate()関数で10進数の指定で行い、そして三角形のような多角形を結ぶ線を生成するためにimagepolygon()関数を使っています。
生成されたPNG画像を Webブラウザに出力させるためには、imagepng()関数を使い、その引数に画像リソースを指定します。また、閲覧者のメモリから画像リソースを解放するために、imagdestroy()関数を利用します。
こうしたイメージ関数を巧みに使うことで、より複雑でしかも容量の軽い画像を作成することができます。
ただし、イメージ関数を利用する際には、あらかじめ利用するPHPにGD(グラフィック用バイナリライブラリ) をインストールしておく必要があります。現在はバージョン2がリリースされており、オープン・ソース・ソフトウェアのため、誰でも自由にダウンロードして使うことができます。
なお、Windows版では、ZIP形式からインストールしたPHP4.3に、あらかじめGD2が含まれています。インストーラー形式のPHP4.3では搭載されていない場合がありますので注意してください。
  最新GDライブラリの入手先
◇セッション管理
□セッション管理の必要性
Webデータのやり取りは、クライアント側のユーザエージェントとHTTPプロトコルが使われます。HTTPは、1回のリクエスト(要求)とレスポンス(応答)の間に、「接続→通信→切断」という一連の処理が行われます。
HTTPプロトコルによって接続・通信・切断を行っている図
つまり、ページを移動するたびに同じ処理が繰り返し行われています。リクエストによってページのデータがレスポンスされ、受信が終わったら通信を切断します。決してクライアントが Webサーバにつなぎっぱなしになることではありません。
例えば、「認証」という手続きが必要なページにアクセスしたとします。パスワードを照合し認証が成功したらページのコンテンツをレスポンスとして送出します。
データがダウンロードされれば通信を切断します。そのとき、クライアントが次のページに移ったとき、サーバ側は切断後の同じクライアントであっても、認証を受けたユーザなのか分からないという問題が発生します。
一度認証されれば、その後認証の必要ないページに移動するのなら問題ないのですが、そうした場合には、誰でも認証なしにそのページを閲覧できてしまう危険が伴います。検索エンジンがそのページにヒットすれば世界中に公開されることになります。
クライアントがページを移動するたびに認証を求められてしまったら、決して快適とはいえません。そこで「セッション管理」を利用することになります。
セッション管理では、認証が成功したクライアントに対して、1つの 「セッションID」 を発行します。そのセッションIDをクライアントのクッキー、あるいは URLを書き換えることによって同一ユーザとみなし、セッション中の管理が容易く行えることになります。
□セッション変数
セッション機能を使うと、「セッション変数」 というセッション中に固有の情報を格納することができます。
例えば、認証が成功するとセッションを維持する方法として、セッションIDがそれぞれのページごとにクライアントの Webブラウザに送られ、Webブラウザが次のページをリクエストすると、Webブラウザから WebサーバにIDを送り返します。
ログインしているクライアントのIDをセッション中に登録しておくことで、Webサーバはそのクライアントのセッションが継続していると判断できます。セッションIDを格納する変数さえ登録できれば、どのページでもいつまでもIDを参照できるということになります。
セッション変数に値を格納するのは、「$_SESSION」を用います。
$_SESSION[セッション変数名] = 値;
セッション変数は、セッションIDと関連付けられ Webサーバ上に保管されます。初期値として特定のディレクトリに、名前の一部にセッションIDが含まれるようなファイルとして保管されます。当然、セッションの数だけファイルが生成されます。
□セッション管理のセキュリティ
セッション管理機能を利用したとき、第三者にセッションIDを知られると、簡単に「なりすまし」というセキュリティ上の危険にさらされます。
クッキーや URLに他人のセッションIDをセットしてリクエストを行うだけで、認証を通さず他人に成りすますことができてしまうので、セッションIDを第三者が見ることができないよう最新の注意を払う必要があります。
クッキー内にデータを格納するのは危険が伴います。クッキー情報は極めて脆弱で信頼性にかける欠点があります。セッションのためにクッキーを使うときには、クッキー内に納められるクライアントのIPアドレスを暗号化したり、セッション情報の中のIPアドレスを保存して、違うIPアドレスからリクエストを遮断するといった方法があります。
セッションIDの漏洩は、以下のような要因で発生する場合があります。

重要な情報を扱う場合、SSLの利用や、クライアントユーザへの呼びかけを行うことで、セッションIDの漏洩に対して細心の注意を払うようにしたり、また、セッション中部分的にパスワードを要求することも選択肢の1つでしょう。
◇正規表現
□パターンマッチング
パターンマッチングとは、検証する対象が、正規表現で記述された「パターン」に照らし合わせて、それが一致したときに「マッチする」ということになります。
例えば、http://www.scollabo.com/banban/というURIを分解すると、

これを正規表現で 「パターン」 を作成すると、^http://.+/$
このパターンを詳しく解説すると、^は文字列の先頭を表わす「メタ文字」を意味し 、$は文字列の末尾を表わす 「メタ文字」 です。http://は文字列の並びそのものを示しています。
正規表現では、文字そのものを表わすことを「リテラル」と呼び、"." のような記号を 「任意の1文字」という特別な意味を持ちます。
+は、直前に記述された正規表現が1回以上連続するという意味を持ちます。つまり、.+とは、任意の1文字の1回以上の連続というパターンが成立します。ここでは、scollabo、com、banbanなどのアルファベット文字がドットで区切られ連続しているという構造をもちます。
なお、正規表現で使う代表的なメタ文字は以下のとおりです。
メタ文字 意味
^ 文字列の先頭をあらわすが、 [ の次に来る場合や [ ] の中は除く
$ 文字列の末尾を表わす
+ 1回以上の連続する文字
* 0回以上の連続する文字
? 0回、または1回だけの文字
{n} n回以上の連続する文字
{n,m} n回から m回まで連続する文字
{.m} 0回から m回まで連続する文字
[ ] [ ]内のいずれかの1文字
. 任意の1文字 (ただし改行文字を除く)
| OR
() 本文を参照する文字
\ エスケープ文字 (この記号の後の特殊文字をそのまま出力する)
\n 改行文字

この表にしたがって、先ほどのURIを更に絞り込んだパターンを作成すると、
^http://[a-z]+(\.[c-o]+)+/[a-n]+$
このパターンでは、http://以降の最初の文字列がa ~ zの間の小文字アルファベットで、次がカンマを含んだc ~ oまでの小文字アルファベット、最後はスラッシュの後にa ~ nまでの小文字アルファベットであることが分かります。
[a-z]のようなパターンを 「文字クラス」 と呼び、大文字や小文字、数字などを利用することができます。
以下は、正規表現で利用できる文字クラスです。

◇ Appendix --- PHP関連用語解説
□ Apache
Apacheは UNIX系OSや Windowsで動作する高機能な Webサーバです。Apacheはオープン・ソース・ソフトウェアとして無償で公開され、世界中のボランティアの技術者たちの手によって開発されました。フリー版でありながら、誰でも修正・再配布することができます。
Apacheとはもともと、NCSA httpサーバの細かいバグを修正したり、新しい機能を追加するためのパッチ (patch) の寄せ集めとして開発されていたため、この名称がついたと言われています。現在の Apacheは単独で動作する Webサーバとして利用することができるため、世界で最も人気のある Webサーバとなっています。
□ MySQL
TCX DataKonsultAB社などが開発しているオープン・ソース・ソフトウェアのリレーショナルデータベース管理システム (RDBMS) で、「まい・えす・きゅー・える」と発音します。
大きな特徴として、マルチユーザ、マルチスレッドで動作し、高速性とその堅牢性に定評があります。オープンソースなので基本的には無償で利用することができ、Windowsや各種 UNIX系OSなど、多くのプラットフォームで動作するのも特長の1つです。
この MySQLは、Microsoft社のデータベースシステム SQLとの互換性も高く、開発が容易いで高機能なところが受けているようです。
同じフリー・ソフトウェアの PostgreSQLデータベースと並ぶ人気の高いデータベースシステムで、非常に多くのサイトで PHPと併用で採用されています。
□ Perl
米国ラリー・ウォール (Larry Wall)氏が開発したプログラミング言語で、Practical Extraction and Report Language を略して「Perl」パールと読みます。
テキストの検索や抽出、レポート作成に向いた言語で、表記法は C言語に似ているのが特徴的ですが、いずれにせよ難解な言語です。テキストベースのインタープリタ型であるため、プログラムを作成したら、コンパイルなどの処理を行なうことなく、すぐに実行することができる利便性を持っています。
CGIの開発によく使われることで知られており、とにかく機能が豊富なことで人気のある言語です。当初 はUNIX上で利用されましたが、現在では Windowsを含む様々なプラットフォームに移植されています。 inserted by FC2 system