連載
» 2007年05月15日 00時00分 UPDATE

今から始める MySQL入門(6):DAOパターンですっきりコーディング! (1/4)

[鶴長鎮一,@IT]

 連載第5回「MySQLの基礎を学ぼう [サンプル開発編]」では、MySQLサーバと連携した簡易オンラインストアを作成しました。

 ただし、固定された商品アイテムの取り扱いのみで、商品の追加や価格の変更を柔軟に行うことができませんでした。今回からは、商品アイテムもMySQLで管理できるよう『簡易在庫管理システム』の作成に取り掛かります。

 各商品アイテムをデータベースに登録するため、オンラインストア開発以上にデータベースへのアクセスが発生します。そこで、データベース操作を一まとめにしたクラスを作成して、そのクラスを利用してデータベースへアクセスするようにします。

関連リンク:

連載 快速MySQLでデータベースアプリ!

http://www.atmarkit.co.jp/flinux/index/indexfiles/mysqlindex.html

連載 今から始める MySQL入門

http://www.atmarkit.co.jp/flinux/index/indexfiles/mysql5index.html


クラスを利用する

 ご存じのとおり、PHP5はJavaに匹敵する十分なオブジェクト指向性を有しています。「クラス化」「継承」「オーバライド」……。

 こうした用語に「げっ!」と思った方、ご安心ください。今回は、簡単なサンプルを例に、最低限必要となる知識を中心に解説していきます。とにかく身構えずにチャレンジしてください。

 なお、PHP5で強化されたオブジェクト指向性については「オブジェクト指向言語に生まれ変わるPHP5」を参考にしてください。また、オブジェクト指向全般について学習したい場合は「5分で絶対に分かるオブジェクト指向」もお勧めです。

サンプルでセッター、ゲッターを学ぶ

 ここでは、サンプルを用いて「マジックメソッド」「アクセス修飾子」「セッター・ゲッター」の使用例について解説します。

 まずは、TestClass.php(リスト1)でTestClassを定義し、それを取り込み利用するTest.php(リスト2)を用意します。

1  <?php
2  class TestClass {
3
4    //メンバ変数
5    private $id = "";
6
7    //コンストラクター
8    function __construct(){
9      print "初期化されました\n";
10    }
11
12    //デストラクター
13    function __destruct(){
14      print "破棄されました\n";
15    }
16
17    //echo()やprint()で文字列への変換が必要なときに呼び出されるメソッド
18    public function __toString(){
19      return (string)("idには" . $this->id . "がセットされています\n");
20    }
21
22    //ゲッター
23    public function getId(){
24      return $this->id;
25    }
26    //セッター
27    public function setId($id){
28      $this->id = $id;
29    }
30  }
31  ?>
      リスト1 TestClass.php

 TestClass(リスト1)は、1つの変数「$id」と変数にアクセスするためのセッターメソッド「setId()」ゲッターメソッド「getId()」を持った単純なクラスです。

8、13、18行目

 「__(アンダースコア2つ)」で始まるメソッドは、マジックメソッドと呼ばれる特別な意味を持ったメソッドです。「__construct()」は初期化される際に、「__destruct()」は破棄される際に呼び出されます。

 各メソッドや変数の前には、「private」「public」といった修飾子を設け、アクセス制限を施します。privateはクラス内からのみ参照可能で、publicはクラス内外からの参照が可能です。ほかに同クラスと子クラス(そのクラスを継承して作成されたクラス)からの参照が可能な「protected」が用意されています。修飾子が省略された場合は、publicと同様の扱いになります。

5行目

 TestClassの変数$idにはprivateが設けられ、外部クラスから参照することができません。

23、27行目

 $idにアクセスするには、setId()(セッターメソッド)、getId()(ゲッターメソッド)を使用します。そのため、2つのメソッドは外部から利用できるようpublicが設けられています。

 こうして外部から使用できる変数やメソッドを必要最小限にとどめ、設計者の意図しない不正な変数操作が行われないようカプセル化を実施します。

 続いて、Test.php(リスト2)を見てみましょう。

1  <?php
2  require_once("TestClass.php");
3  print "開始\n";
4  $test = new TestClass();
5  $test->setId("テスト");
6  print $test;
7  $test = null;
8  print "終了";
9  ?>
10
      リスト2 Test.php

2行目

 「require_once」でTestClass.phpファイル(リスト1)を読み込みます。「require」と違い、すでに読み込まれたファイルは再読み込みされません。

4行目

 new演算子でTestClassを生成(インスタンス化)します。その際、TestClassの「__construct()」(リスト1の8行目)が実行されます。

5行目

 setId()メソッドで$idに文字列「テスト」をセットします。

変数の直接参照とセッターの利用例

TestClassのインスタンス化

$test = new TestClass();

ケース1:$idがpublic変数
$test->id = "テスト";

変数に直接値を設定する。クラス設計者が意図しない値が代入されてしまう可能性がある。

ケース2:$idがprivate変数
$test->setId("テスト");

セッターを使って値を設定する。setId()で入力判定を行うことができる。

6行目

 printで$idを表示させます。TestClassに対して、echoやprintが行われた場合、どのような文字を出力するかをTestClassの「__toString()」メソッドで指定できます。

7行目

 最後にnullを代入し、TestClassを廃棄して終了します。TestClassが破棄される際には、TestClassの「__destruct()」が実行されます。

 それでは、サンプルを実行してみましょう。ちなみに、今回はコマンドラインで確認してみます。

 以下のように、phpコマンドでTest.php(リスト2)を実行します。PHPをRPMなどのパッケージからインストールした場合は/usr/bin/php、ソースを使ってインストールした場合は/usr/local/bin/phpで実行できます。

$ php -f Test.php
(ソースからインストールした場合は/usr/local/bin/php)
開始
初期化されました ←TestClass.phpの8〜10行目が実行
idにはテストがセットされています ←TestClass.phpの18〜20行目が実行
破棄されました ←TestClass.phpの13〜15行目が実行
終了

コラム1 PHP 5.2と5.1の__toString()の違い

__toString()メソッドは、printやechoといった文字列への置換が必要な場合に呼び出されるメソッドです。しかし、PHP 5.2未満では単純なprintを除き、オブジェクトIDが表示されるなど、PHPのバージョンで振る舞いに差異があります(下記参照)。そのため本稿ではどちらでも対応できるよう単純なprint文を使用しています。

例えば、Test.php(リスト2)6行目

print $test ."文字連結\n";

としたら、

「PHP5.1」の場合は、以下のような結果となります。

$ php -v ←PHPバージョンの確認
PHP 5.1.6 (cli) (built: Apr  5 2007 09:39:43)...省略
$ php -f Test.php
(省略)
初期化されました
Object id #1文字連結 ←オブジェクトIDが表示される
破棄されました
(省略)

また、「PHP5.2」の場合は、以下のような結果となります。

$ php -v ←PHPバージョンの確認
PHP 5.2.0 (cli) (built: Jan 16 2007 03:02:24)...省略
$ php -f Test.php
(省略)
初期化されました
idにはテストがセットされています ←__toString()メソッドが実行される
文字連結
破棄されました
(省略)

       1|2|3|4 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。