連載第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)を用意します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
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)を見てみましょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
2行目
「require_once」でTestClass.phpファイル(リスト1)を読み込みます。「require」と違い、すでに読み込まれたファイルは再読み込みされません。
4行目
new演算子でTestClassを生成(インスタンス化)します。その際、TestClassの「__construct()」(リスト1の8行目)が実行されます。
5行目
setId()メソッドで$idに文字列「テスト」をセットします。
変数の直接参照とセッターの利用例
TestClassのインスタンス化
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
変数に直接値を設定する。クラス設計者が意図しない値が代入されてしまう可能性がある。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
セッターを使って値を設定する。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で実行できます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
コラム1 PHP 5.2と5.1の__toString()の違い
__toString()メソッドは、printやechoといった文字列への置換が必要な場合に呼び出されるメソッドです。しかし、PHP 5.2未満では単純なprintを除き、オブジェクトIDが表示されるなど、PHPのバージョンで振る舞いに差異があります(下記参照)。そのため本稿ではどちらでも対応できるよう単純なprint文を使用しています。
例えば、Test.php(リスト2)の6行目を
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
としたら、
「PHP5.1」の場合は、以下のような結果となります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
また、「PHP5.2」の場合は、以下のような結果となります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Copyright © ITmedia, Inc. All Rights Reserved.