ObjectSquare [2001 年 10 月号]

[技術情報]





PHP4 + PostgreSQL7 で構築する Web-DB 入門

第 1 回 〜スクリプト言語 PHP 編〜


株式会社オージス総研
マーケティング企画部
山井 智博

▼ 目次
1. はじめに。
2. PHP ってなんですか?
3. とりあえずPHPのソースを覗いてみよう。
4. フォームの値を取得してみる。
5. なんちゃって(?)オブジェクト指向プログラミング。
6. おわりに。


■ 1. はじめに。

昨今のシステム開発では、Web 系のシステムが大流行のようで、実際、弊社への開発引き合い案件を見てみても、約 4 割方が Web 系のシステムとなっています。

確かに、一末端エンジニアからみても、クライアントには Web ブラウザがインストールされていればよい、というお手軽さはとても魅力に感じます。

ちなみに、私が前にいた会社では、約 10 年前から稼動しているクライアント/サーバ型システムの保守をしていましたが、クライアントが 1,000 台超あり、10年前から稼動している 1,000 台ともなるとやはりマシンの耐用年数のこともあり、毎日クライアント数台がオシャカになり、OS の再インストールからシステムプログラムのインストール、なんて作業ばかりやっていたように思います。

さて、こういった Web 系のシステム開発の場合、J2EE 環境で、JSP で画面を構築してお豆さんに働いてもらう、なんてパターンが多いかと思いますが、例えば、簡単な社内システムなどの場合や、お客様の予算の都合などの制約の中、サクサクっと、しかも殆どお金をかけずに開発ができたら良いとは思いませんか?

そんな皆様に提案させていただくのが、今回の特集である「PHP + PostgreSQL で構築する Web-DB システム」です。

末端社員の主張ですが、PHP 等のスクリプト言語で開発した場合と、J2EE で開発した場合の、システム規模と工数の関係は、以下の様になると考えています。

PHP と J2EE のシステム規模と工数の関係モデル

システムの規模が小さいほど PHPでの開発効率が上回り、システム規模が大きくなるほど、J2EE での開発効率が上回る、というかなり直感的なグラフです。
(このグラフが交わる点を、use-case 数等で算出してみても、面白いかもしれませんね)

ちなみに、筆者はつい先日まで、画面数 20 枚のシステムを、PHP と PostgreSQL を使用して、サーバのセットアップも含めて 2 週間で実装しました。もしも、これが J2EE 環境での開発だった場合、とても 2 週間ではコーディングアップできなかったことでしょう。

さて、ご存知ない方のために簡単に説明させていただくと、PHP は Perl ライクなスクリプト言語、PostgreSQL は商用データベース製品にも匹敵する、高機能な RDBMS です。

PHP・PostgreSQL は共にフリー(正確にはそれぞれ PHP ライセンス・BSD ライセンスといった形態で配布されているのですが、ここでは「無償で使用可能なソフトウェア」の意として、「フリー」と書かせていただきます)のソフトウェアですが、 今回の特集では、これらを使用した、お手軽 Web-DB システム開発へのアプローチをご提案させていただきます。
(PHP は、バージョン4より、GNU ライセンスから PHP ライセンスという独自のライセンス形態に変更されました)

今の所、全 3 回の連載を予定していますが、PHP の細かな文法や、PostgreSQL のデータベース操作、チューニング等にはあまり触れない予定です。
あくまで、フリーで提供されている「良質のソフトウェア」をご紹介させていただく、といったスタンスでお話を進めさせていただければ、と考えています。

なお、今回の連載では、
PHP4.0.5
PostgreSQL7.1.2
を使用します。

この連載を、楽しんでいただければ、幸いに思います。(2001/09/13)



■ 2. PHPってなんですか?

PHP とは、一言でいうと「HTML に埋め込み、サーバサイドで実行されるスクリプト言語」です。

なお、PHP は、Hypertext Preprocessor の略(?)だそうです。
「それなら、HP でいいじゃないか?」と私は最近までひどく憤りを感じていたのですが、同僚のAべ君が解決してくれました。

もともと、PHP は 1994年、Rasmus Lerdorf 氏が個人的な Webサイトに使用するための Perl で書かれたスクリプト群でした。これを C 言語で書き直し、リリースされたのが Personal Home Page Tools、略して PHP だそうです。

Personal Home Page Tools が Hypertext Preprocessor なんていう苦し紛れな略称に変わった理由については定かではありませんが、PHPはその後も順調に機能が追加され、2000 年 5 月 23 日には、今回の特集で採り上げる PHP4 がリリースされました。

Web サイトのサーベイを行っている NetCraft によると、2000年7月時点において 約 300 万ホストで PHP が動作していたのが、2001 年 8 月の統計では、約 700 万ホストまで増加したとしています。これほどまで急激に PHP の利用数が増えたのは何故なのでしょう。

その理由としては、以下のような事柄が考察されます。

多彩なデータベースをサポートし、それらを扱う関数群が豊富である
PostgreSQL を筆頭に、Oracle, DB2, Informix, Sybase, SQLServer, ODBC, MySQL をサポートしており、それぞれのデータベースへの接続関数、クエリ発行関数等が既に用意されています

例えば、PostgreSQL のデータベースに接続するには、既に用意されている pg_connect() という関数をコールするだけで、簡単に接続することが可能です。
(例)$dbHandle = pg_connect("host=localhost port=5432 dbname=testDB");
言語設計がとにかく易しい
文法は、Perl + C といった感じですが、とにかく単純で(すなわち覚えるべきことが少ない)、プログラム経験者であれば 1 日 PHP 本を読むだけで、大抵のことは出来るようになります。

文法が単純なだけに、プログラマは沢山用意されている関数をいかに使いこなすか、といった点だけに集中することができます。
Java もそうでしたが、これからの言語はこうあって欲しい、と思います (末端社員の主張 2)。
HTML フォームの値を簡単に取得することが可能
個人的には、これが PHP を利用する上での一番の魅力だと考えているのですが、例えば、<FORM><INPUT TYPE="text" NAME="hoge"></FORM> と書くだけで、$hoge という変数が勝手に作成され、入力された値を取得することが可能です。

これについては、後ほど、詳しく説明します。
CGI よりも動作が高速である
Web サーバの代名詞とも言える Apache にモジュール(DSO : Dynamic Shared Object)として組み込むことで、CGI よりも高速に動作すると言われています。

Web 系システムの構築でよく使用される手段として、CGI が挙げられますが、これは、クライアントからの要求があっただけのプロセスをサーバ側に発生させます。すなわち、多くのリクエストがサーバに送信された場合、サーバ側のリソースをプロセス分だけ消費し、レスポンスが極端に遅くなる可能性があります。

PHPでは、Apache の DSOとして実行させた場合、クライアントのリクエストは Apache 内で処理され、多くのリクエストが集中するケースでは、CGI よりも高速に動作するとされています。
デバッグが容易である
エラーが発生すると、エラーの発生したスクリプトの行番号と原因を出力してくれます。
CGIによる開発のように、原因不明の「Internal Server Error」に泣かされることがありません



■ 3. とりあえず PHP のソースを覗いてみよう。

それでは、とりあえず PHPのソースを覗いてみましょう。

まずはお約束の、Hello World ! プログラムから。
<HTML>
<BODY>
<?php
  print "Hello World !!";
?>
</BODY>
</HTML>
実行結果は、以下のようになります。

Hello World 実行結果

PHP のスクリプト部が、<?php 〜 ?> のブロックに記述されているのがわかると思います。
なお、この <?php といった PHP 開始/終了宣言の文字列は、設定ファイル(php.ini)にて定義されています。
例えば、ASPのように <% 〜 %> に変更することも可能です。


次は、もう少し複雑なソースを見てみることにしましょう。

<HTML>
<BODY>
<?php

  // 配列の作成(宣言がなされていないことに注目!)
  $array[0] = 4;
  $array[1] = 3;
  $array[2] = 1;
  $array[3] = 5;
  $array[4] = 2;

  // 配列をソートする
  $sortedArray = getSortedArray($array);

  // ソート結果を表示する
  for( $i=0; $i<count($sortedArray); $i++ ) {

    print "array[$i] = " . $sortedArray[$i] . "<BR>\n";
  }

  exit();

  /**
   * バブルソートでソートした配列を返す
   *
   * @param $data ソートするint型配列
   * @return $data ソートしたint型配列
  **/
  function getSortedArray($data) {

    for( $i=0; $i<count($data); $i++ ) {
      for( $j=count($data)-1; $j>$i; $j-- ) {

        // 隣り合う配列要素を比較する
        if( $data[$j] < $data[$j-1] ) {

           $tmp = $data[$j];
          $data[$j] = $data[$j-1];
          $data[$j-1] = $tmp;
        }
      }
    }

     return $data;
  }

?>
</BODY>
</HTML>

いかがでしょうか?

int 型の配列 $array を作成し、関数 getSortedArray() でソートし、結果を表示するだけの単純なプログラムです。

ちなみに、実行結果は、以下のとおりです。

バブルソート実行結果

ところで、他の言語に慣れている方は、おかしなことに気づきませんか?
それは、
(1) 配列 $array が宣言されることなく使用されている。
(2) 関数に返り値の定義がない。
(3) 関数の引数に、型の指定がない。

ということです。

まず (1) についてですが、PHP では、変数の定義は(そして型の宣言も)必要ありません。いつでもどこでも勝手に変数を作成して、値を代入することが可能です。

ここが面白いところなのですが、 PHP では、変数に代入された値の型が、その変数の型となります
ちょっと Smalltalk っぽくないですか? オブジェクト指向っぽくないですか?

ただし、変数の定義が不要なため、同じ変数スコープの中で同じ名前の変数を複数度、異なった用途で使用してしまう可能性は否めません。

ちなみに、PHP で使用可能な型は、以下のとおりです。
boolean
integer
double
string
object
resource
NULL

型の話が出たついでに、PHPの面白い点をお話させていただくと、PHPでは、if 文等で使用される比較演算子に「==」だけでなく、「===」をサポートしています。
なお、「==」は比較対象の値が等しい、「===」は比較対象の値、および型が等しい場合に TRUE を返します。
# これに乗じて「=====」なんて演算子が登場してくると、さすがに困りますが。

(2)(3) については、ちょっと気持ち悪いですね。
引数の型によって関数を区別することができず、同じ名前の関数は、引数の数のみによって区別されるため、関数のオーバーロードを実現するのが困難になります。

また、関数に返り値があるのかないのか、ぱっと見て判断できない点も気になります。

これはプログラマに型を意識させないというポリシーなのかもしれませんが、その割に、「===」演算子や gettype()なんて関数も用意されており、ちぐはぐな印象を受けます。



■ 4.フォームの値を取得してみる。

さて、本章では、PHPの最も強力な機能と思われる、フォームデータの取得方法について説明してみたいと思います。

これについては、先の章でも述べましたが、簡単に言うと、例えばテキストフィールドを作成すると、そのテキストフィールドと同じ名前の変数が自動的に作成されるというものです。

それでは早速、例を見てみましょう。

<HTML>
<BODY>

<!- テキストフィールドと送信ボタンを表示する ->
<FORM ACTION="sample.php" METHOD="POST">
好きな文字を入力してください: 
<INPUT TYPE="text" NAME="val" VALUE=""><BR>
<INPUT TYPE="submit" VALUE="送信">
</FORM>

<BR>

<?php
    print "入力された値は、<B>" . $val . " </B>です。";
?>

</BODY>
</HTML>


実行結果は、次のとおりです。

テキストフィールドから値を取得する

テキストフィールドにつけた、「val」という名前から、$val という変数が作成されているのがわかりますね。

もし、これを Perlの CGIで実現しようとすると、cgi-lib.pl 等のライブラリを使用し、&ReadParse() -> 値の取り出し -> 値のデコードという、面倒な作業が必要となってしまいます(PHPでも、デコードは必要ですが)。

これと比較すると、PHPでは、いかに簡単に、フォームデータを取得できるかがわかりますね。

また、複数選択可能なリストボックスでは、以下の様に配列が自動的に作成されます。

<HTML>
<BODY>

<!- 複数選択可能なリストボックスと、送信ボタンを表示する ->
<FORM ACTION="sample.php" METHOD="POST">
<SELECT NAME="multiple[]" MULTIPLE>
  <OPTION VALUE="Java">java</OPTION>
  <OPTION VALUE="Smalltalk">smalltalk</OPTION>
  <OPTION VALUE="ruby">ruby</OPTION>
  <OPTION VALUE="C++">C++</OPTION>
</SELECT>
<BR><BR>
<INPUT TYPE="submit" VALUE="送信">
</FORM>
<BR>

<?php
// 配列の要素を表示する
for($i=0; $i<count($multiple); $i++) {
  print "multiple[$i] = ". $multiple[$i] . "<BR>";
}
?>

</BODY>
</HTML>


実行結果は、以下のとおりです。

リストボックス


■ 5. なんちゃって(?)オブジェクト指向プログラミング。

PHP では、オブジェクト指向によるプログラミングもサポートしています。

それでは早速、クラスを定義したソースを見てみましょう。

<HTML>
<BODY>
<?php
  class Mouse {

    // 属性は、var の後に記述します
    var $name;

    // クラス名と同じメソッドがコンストラクタになります
    function Mouse( $n = "chu" ) {
         $this -> name = $n;
    }

    function getName() {
      return $this -> name;
    }
  }

  // インスタンスの生成
  $jerry = new Mouse("Jerry");

  // メソッドの呼び出し
  print $jerry -> getName();
?>
</BODY>
</HTML>

実行結果は以下のとおりです。

クラスの定義

サンプルは、クラス Mouse を定義し、インスタンス「$jerry」を作成し、属性「name」を取得しています。
なお、属性や関数へのアクセスは、C++ 言語のようにアロー演算子(->)を使用します。

実のところ、PHP のオブジェクト指向は、それほど強力ではありません。
この章の表題にも「なんちゃって」とつけたとおり、PHP のクラスは、C 言語の構造体に関数がくっついたもの、といった感じです。

そして、残念ながら、上記のサンプルコードで、PHPのほぼ全てのオブジェクト指向の機能を説明していると言っても、過言ではありません。
属性やメソッドは全て public であり、デストラクタ等はなく、強いて言えば、他にクラスの継承が行える、といったところでしょうか。
(継承は、java と同じように class A extends B {} とします)

ただし、筆者は オブジェクト指向の本質は、カプセル化や継承、ポリモアフィズムといった概念にあるのではなく、「実世界の物事を、コンピュータの世界にシームレスに投影する」ことにあると考えています。
現実とモデルの間に、意味的乖離がないことが、オブジェクト指向の究極の目的、ベクトルではないでしょうか?そして、それは例えば多重継承等が使えなくても、問題ないのではないでしょうか?

そういった点を考えると、PHP のオブジェクト指向も、これはこれでよいのかな、と思います。
#ただし、やはりオブジェクト指向で組むなら、Java か C++ ですよね。あ、Smalltalkも。 ;-)



■ 6. おわりに。

さて、これまで PHP の強力な機能、そして弱いと思われる機能についてご紹介させていただきましたが、いかがだったでしょうか?

Personal Home Page Tool と、もともと Web サイト構築のために開発された言語だけに、Perl 等で CGI を組むよりも、ずいぶんスマートにスクリプトを記述できることがおわかりになったかと思います。

肝心のオブジェクト指向への対応は今ひとつですが、第 1 章「はじめに」でも述べたとおり、 経験的に、比較的小規模な Webシステムの構築には、J2EE で組むよりもはるかに効率がよいと思われます。

そして興味を持たれた方は、ぜひ、PHP4 をダウンロードして、遊んでみてください。
(なお、今回の特集では PostgreSQL との連携を目的としているため、PHP4 のインストール前に、PostgreSQL をインストールされることをお勧めいたします。これは、PHP4 のインストールにおいて、コンパイル・オプションに PostgreSQL へのパスを指定しなければならないためです)

次回は、商用データベース製品にも匹敵する、高機能なフリーの RDBMS「PostgreSQL」の紹介を行う予定です。

それではまた来月、お目にかかれることを楽しみにしています。

adios !!


▼ 参考文献
『PHP4でカンタンWebDB構築ガイド』 秀和システム 2001年
『PHP4徹底攻略』 ソフトバンク 2000年
PHP 公式Webサイト(英語)
日本 PHP ユーザ会
▼ 参考リンク
PostgreSQL 本家(英語)
日本 PostgreSQL ユーザ会
Apache 公式Webサイト(英語)


記事の内容を5点満点で評価してください。
1点 2点 3点 4点 5点
記事に関するコメントがあれば併せてご記入ください。
  



© 2001 OGIS-RI Co., Ltd.
Index Next
Index Next