スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
今から始める MySQL入門

今から始める MySQL入門(6)

DAOパターンですっきりコーディング!



鶴長 鎮一(book@tsurunaga.jp)
2007/05/15

 連載第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

今から始める MySQL入門 クラスを利用する


 ご存じのとおり、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()メソッドが実行される
文字連結
破棄されました
(省略)

 

第5回へ
1/4

Index
今から始める MySQL入門(6)
 DAOパターンですっきりコーディング!
Page 1
 クラスを利用する
   サンプルでセッター、ゲッターを学ぶ
  Page 2
 サンプルのインストールと実行
   MySQLサーバ側の準備と確認
 サンプルでDTO、DAOパターンを学ぶ(1)
  Page 3
 サンプルでDTO、DAOパターンを学ぶ(2)
  Page 4
 サンプルでDTO、DAOパターンを学ぶ(3)

連載 今から始める MySQL入門


 Linux Squareフォーラム データベース関連記事
連載:快速MySQLでデータベースアプリ!(全11回)
軽快な動作で知られるRDBMS、MySQLでDBアプリの構築を行う。MySQLのインストールに始まり、PerlやRubyなどのスクリプトでデータベースを操作する方法までを完全解説
連載:今から始める MySQL入門(連載中)
定番のLAMP(Linux+Apache+MySQL+PHP)構成でWebアプリケーション開発に挑戦! サンプルアプリの構築を進めながら、基礎知識や操作方法について詳しく解説する
連載:Oracleマイスター養成講座(全6回)
本連載では、Oracleの管理・チューニング方法を紹介していく。これからOracleを始める人、そしてOracleをより深く理解したい人のための、一歩踏み込んだ実用講座
連載:DB2マイスター養成講座(全7回)
本連載では、DB2 UDBの実践的な運用・管理方法を紹介していく。DB2を利用するうえで必要な知識を、実運用を前提にDB2のプロが解説
特集:エンタープライズ市場に向かうMySQL 5.0[前編]
MySQL 5.0の新機能をアルファ版でチェック
1月に公開された5.0アルファ版は大幅に拡張されており、エンタープライズ市場への進出を予感させる
特集:Linuxで動くリレーショナルデータベース・カタログ
データベースサーバのOSとしてLinuxを採用するケースが増えている。Linuxで動作する7つの主なリレーショナルデータベースを紹介する。製品導入の際の参考にしてほしい

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します
Linux Square フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

スキルアップ/キャリアアップ(JOB@IT)



- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT

ソリューションFLASHPR